Usando Generics para obter um ponteiro para qualquer tipo em Go
Em Go, usamos ponteiros para definir que um valor pode ser opcional.
Frequentemente, usamos o operador &
para fornecer o valor do ponteiro para um método, com isso, possamos fazer algo assim:
método(&api.Resposta{})
O problema é que nem todo tipo pode usar o operador &
, por exemplo, não podemos fazer isso com uma string:
ptr := &"foo"
// compilation error:
// não pode receber o address de "foo" (untyped string constant)
Hum, interessante! Fale mais.
Como podemos contornar isso? Uma opção é usar uma variável intermediária:
s := "foo"
ptr := &s
Mas dependendo de quantos parâmetros precisam ser convertidos em ponteiros, isso pode ser um pouco estranho.
Alternativamente, com o suporte do Go 1.18 para generics, podemos criar um método auxiliar como o abaixo, que nos dá a capacidade de fazer isso com qualquer tipo:
func PtrTo[T any](v T) *T {
return &v
}
func main() {
fmt.Println("foo")
fmt.Println(PtrTo("foo"))
}
Créditos
- Using generics to get a pointer to any type, in Go escrito originalmente por Jamie Tanna.