No Go, um requisito comum é ter uma função que opere em dados de diferentes tipos. Tomemos, por exemplo, uma função que conta o número de elementos em uma fatia de um tipo específico. Como alguém pode projetar esta função para lidar com qualquer tipo de dados, não apenas o tipo específico para o qual foi inicialmente projetado?
Uma abordagem é usar interfaces, que são essencialmente contratos que definem um conjunto de métodos que um tipo deve implementar para estar em conformidade com a interface. Usando interfaces como parâmetros de método, podemos escrever funções genéricas que podem funcionar com qualquer tipo que implemente a interface necessária.
Considere o exemplo a seguir, onde pretendemos criar uma função genérica Count que conta o número de elementos em uma fatia:
func Count[T any](s []T) int {
return len(s)
}
Usando genéricos como este, podemos passar fatias de qualquer tipo para Count, permitindo que ele conte elementos dinamicamente com base no tipo de entrada.
Além disso, podemos utilizar interfaces para implementar métodos genéricos para tarefas específicas. Por exemplo, podemos definir uma interface Identifiable com um método GetID e criar uma função genérica FindByID que procura um elemento dentro de uma fatia com base em seu valor de ID, independentemente do tipo real dos elementos da fatia:
type Identifiable interface {
GetID() int
}
func FindByID[T Identifiable](s []T, id int) *T {
for i, v := range s {
if v.GetID() == id {
return &s[i]
}
}
return nil
}
Ao incorporar interfaces e genéricos, ganhamos o poder de criar funções que são altamente flexíveis e podem operar de forma eficaz em dados de vários tipos.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3