Sobes.tech
Middle+

Que meios de programação genérica existem?

sobes.tech IA

Resposta da IA

No Golang, existem os seguintes meios de programação genérica (genéricos):

  1. Tipos parametrizados: Permitem criar estruturas, interfaces e funções que podem trabalhar com diferentes tipos de dados sem especificá-los rigidamente na fase de compilação. Os tipos de dados são indicados entre colchetes após o nome do tipo ou função.

    // Exemplo de estrutura com tipo parametrizado
    type Stack[T any] struct {
    	elements []T
    }
    
    // Exemplo de função com tipos parametrizados
    func Map[T, U any](collection []T, f func(T) U) []U {
    	result := make([]U, len(collection))
    	for i, item := range collection {
    		result[i] = f(item)
    	}
    	return result
    }
    
  2. Restrições de tipos (Type Constraints): Definem um conjunto de tipos que podem ser utilizados como parâmetros genéricos. Permitem limitar a universalidade dos tipos e garantir a segurança das operações.

    • Interfaces: Qualquer interface por si só é uma restrição de tipo.
    • Interfaces combinadas: Permitem combinar vários tipos ou interfaces usando o operador |.
    // Exemplo de restrição de tipo usando uma interface combinada
    type Number interface {
    	int | int8 | int16 | int32 | int64 |
    		uint | uint8 | uint16 | uint32 | uint64 | uintptr |
    		float32 | float64 |
    		complex64 | complex128
    }
    
    // Função que usa a restrição de tipo
    func Add[T Number](a, b T) T {
    	return a + b
    }
    

Estas ferramentas foram adicionadas no Go 1.18. Antes disso, para implementar algo semelhante a genéricos, usava-se interfaces (interface{}) e reflexão, o que reduzia a segurança de tipos e o desempenho.