Rafael

Engenheiro de Software

Olá, Eu sou Rafael. Estou construindo coisas para a web e mobile.

Um desenvolvedor dedicado a criar experiências digitais de alto desempenho, acessíveis e limpas. Eu me especializo em transformar problemas complexos em soluções de engenharia elegantes.

Generics em Structs, Métodos e interface no Go: um exemplo prático

Desde o Go 1.18, a linguagem passou a suportar generics, permitindo escrever código mais flexível e reutilizável sem abrir mão da segurança de tipos em tempo de compilação. Um dos usos mais interessantes dessa funcionalidade é a criação de structs genéricas com métodos genéricos associados a elas, isso na versão Go 1.27 e, também criar nossa própria interface com métodos genéricos.

Neste post, vamos analisar um exemplo simples que demonstra como declarar uma struct genérica, criar uma função construtora e definir métodos que operam sobre o tipo genérico.

GO
type Test[T float64 | int] struct {
    number T
}

func NewTest[T float64 | int](number T) Test[T] {
    return Test[T]{number: number}
}

func (t Test[T]) GetNumber() T {
    return t.number
}

func (t *Test[T]) SetNumber(number T) {
    t.number = number
}

func main() {

    number := NewTest(30.0)
    fmt.Println(number.GetNumber())

    number2 := NewTest(10)
    fmt.Println(number2.GetNumber())
}

Desta forma conseguimos criar métodos genéricos de acordo com a struct também com parâmetros genéricos. O que muda é a flexibilidade de trabalhar com genéricos sem utilizar interface ou any.

Outro maneira é usar genéricos na interface, vamos ver um exemplo:

GO
type Container[T int | float64] interface {
	Get() T
	Set(T)
}

type Box[T int | float64] struct {
	value T
}

func (b *Box[T]) Get() T  { return b.value }
func (b *Box[T]) Set(v T) { b.value = v }

func main() {
	var c Container[float64] = &Box[float64]{}
	c.Set(42.7)
	fmt.Println(c.Get()) // 42.7

	var cc Container[int] = &Box[int]{}
	cc.Set(4)
	fmt.Println(cc.Get()) // 4
}

0 comentários

Deixe seu comentário