Quais são as formas de escrever código genérico em Go?
sobes.tech IA
Resposta da IA
No Go, as principais formas de escrever código genérico são as seguintes:
-
Interfaces: Permitem escrever funções que funcionam com qualquer tipo que satisfaça um conjunto definido de métodos.
// Definição de uma interface Reader type Reader interface { Read(p []byte) (n int, err error) } // Função que funciona com qualquer tipo que implemente Reader func ProcessData(r Reader) error { // leitura de dados do Reader return nil } -
Interface vazia (
interface{}): Tipo universal que pode representar qualquer valor. Requer conversão de tipos antes de usar.func PrintAnything(v interface{}) { // Conversão de tipo com verificação if s, ok := v.(string); ok { fmt.Println("Isto é uma string:", s) } else if i, ok := v.(int); ok { fmt.Println("Isto é um número inteiro:", i) } } -
Genéricos (Generics) / Tipos parametrizados (parâmetros de tipo): Permitem escrever funções e tipos que trabalham com conjuntos arbitrários de tipos especificados na declaração. Adicionados no Go 1.18.
// Função que trabalha com slices de qualquer tipo T func PrintSlice[T any](s []T) { for _, v := range s { fmt.Println(v) } } // Tipo genérico Pair com parâmetros T1 e T2 type Pair[T1, T2 any] struct { First T1 Second T2 } -
Reflexão (
reflect) : Permite explorar e interagir com tipos e valores em tempo de execução. Frequentemente usado para cenários complexos, mas pode ser menos eficiente e seguro do que outras abordagens.import "reflect" func GetTypeName(v interface{}) string { return reflect.TypeOf(v).Name() }
A escolha do método depende da tarefa específica e do nível de flexibilidade e desempenho necessários. Os generics são a forma preferida para criar algoritmos e estruturas de dados genéricos no Go moderno. Interfaces continuam sendo um mecanismo chave para polimorfismo e definição de comportamento. A interface vazia e a reflexão são usadas com menos frequência, para casos mais específicos.