Usando Generics para obter um ponteiro para qualquer tipo em Go

Photo by Sigmund on Unsplash

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