Sobes.tech
Junior

O que são interfaces na linguagem Go?

sobes.tech IA

Resposta da IA

A interface em Go é uma coleção de assinaturas de métodos. Ela define o comportamento de um objeto: o que ele "pode fazer". A interface não contém dados nem implementações de métodos.

Características principais:

  1. Implementação implícita: Um tipo implementa uma interface implicitamente se fornecer todos os métodos declarados na interface. Não é necessário declarar explicitamente que um tipo implementa a interface.
  2. "Tipagem de pato" (Duck Typing): "Se faz quack como um pato e caminha como um pato, então é um pato". Em Go, o tipo do objeto não importa, desde que implemente o conjunto necessário de métodos.
  3. Valor zero: O valor zero de uma interface é nil. O valor de uma interface pode ser nil se tanto o tipo quanto o valor dentro dela forem nil.
  4. Interface vazia (interface{} ou any): Pode conter um valor de qualquer tipo. Frequentemente usada para trabalhar com dados de tipos desconhecidos ou em contêineres genéricos.

Exemplo de definição e uso:

// Definindo a interface Greeter
type Greeter interface {
	Greet() string // Método Greet que retorna uma string
}

// Definindo o tipo Person
type Person struct {
	Name string
}

// Person implementa a interface Greeter, fornecendo o método Greet
func (p Person) Greet() string {
	return "Olá, " + p.Name
}

// Definindo o tipo Robot
type Robot struct {
	Model string
}

// Robot também implementa a interface Greeter
func (r Robot) Greet() string {
	return "Saudações, modelo " + r.Model
}

// A função aceita uma interface Greeter
func SayHello(g Greeter) {
	fmt.Println(g.Greet()) // Chama o método Greet através da interface
}

func main() {
	person := Person{Name: "Alicia"}
	robot := Robot{Model: "RX-800"}

	SayHello(person) // Passa um Person que implementa Greeter
	SayHello(robot)  // Passa um Robot que implementa Greeter
}

Interfaces promovem um design flexível e desacoplado, permitindo escrever funções que trabalham com diferentes tipos de dados, desde que esses tipos implementem a interface necessária. Elas são usadas para criar código genérico e na biblioteca padrão do Go (por exemplo, io.Reader, io.Writer, fmt.Stringer).