Quando utilizar generics e interfaces

A linguagem Go é amplamente conhecida por sua simplicidade e pragmatismo. O design da linguagem sempre incentivou a criação de código claro e direto, evitando abstrações desnecessárias.

Com a introdução de generics no Go 1.18, desenvolvedores agora têm mais uma ferramenta para criar abstrações poderosas e reutilizáveis. Além disso, as interfaces já desempenham um papel fundamental na criação de designs flexíveis e desacoplados.

No entanto, é preciso cautela: abstrações excessivas podem facilmente adicionar complexidade sem trazer benefícios reais.

Neste post, vamos discutir quando utilizar generics e interfaces em Go e quando é melhor evitá-los.

Leia mais »
rock formation

Como utilizar “herança” em interfaces

Embora o Golang não implemente orientação a objetos, de forma superficial, sua estratégia de embedding – que inclusive é muito utilizada nos packages nativos da linguagem – é muito parecida com a famosa herança.

Nesse post, vou mostrar como utilizar essa estratégia para que possamos ter interfaces mais granulares.

Antes de começar, como o objetivo desse post é exemplificar como utilizar embedding em interfaces, não vamos implementar os métodos. Também não vamos mostrar como utilizá-las em assinaturas de funções/métodos. Caso você queria saber mais sobre como utilizar interfaces, recomendo a leitura do post “Trabalhando com Interfaces”.

Sem mais delongas, vamos criar 3 interfaces. Writer, Reader e Closer.

type Writer interface {
	Write(p []byte) (n int, err error)
}

type Reader interface {
	Read(p []byte) (n int, err error)
}

type Closer interface {
	Close() error
}
Leia mais »

Trabalhando com interfaces

Go é uma linguagem de tipagem forte, ou seja, se eu declarar uma variável do tipo int ela só aceitará valores inteiros. Pode parecer óbvio, no entanto em algumas linguagens é totalmente possível iniciar uma variável como int e no meio do código atribuir um valor do tipo float ou as vezes até mesmo string.

Uma outra diferença do Go com outras linguagens é que em Go não temos o conceito de Orientação a Objetos. Contudo, quando precisamos lidar com um grupo de valores mais complexos, temos a possibilidade de criar nossas próprias estruturas de dados, as structs.

Com isso em mente, sempre que declaramos uma função em Go, precisamos setar o tipo de dado esperado em cada um dos parâmetros, onde muitas vezes esses parâmetros esperam uma struct.

Leia mais »