Sobes.tech
Middle+

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.