Implementando uma Interface
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 14 de 68.
Agora que você sabe como definir uma interface, vamos aprender como os tipos em Go realmente as implementam. A coisa mais importante a entender é que Go usa implementação implícita - não há nenhuma palavra-chave ou declaração especial necessária.
Se um tipo possui todos os métodos que uma interface exige, ele satisfaz automaticamente essa interface. Você não precisa declarar explicitamente que seu tipo implementa a interface - o Go descobre isso para você.
Veja como funciona com a interface Shaper da lição anterior:
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}Como o tipo Circle possui um método Area() que retorna um float64, ele implementa automaticamente a interface Shaper. Não há necessidade de declarar essa relação explicitamente - o Go a reconhece com base na correspondência da assinatura do método.
Essa abordagem implícita torna as interfaces Go incrivelmente flexíveis. Qualquer tipo existente pode satisfazer uma nova interface, desde que possua os métodos necessários, mesmo que a interface tenha sido criada após o tipo ter sido escrito.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Desafio
FácilNeste desafio, você praticará a implementação de uma interface criando um sistema de veículos simples. Você criará uma struct Car que implementa automaticamente uma interface Vehicle por meio da implementação implícita do Go.
Você receberá duas entradas:
- Uma string representando a marca do carro (ex:
"Toyota") - Uma string representando a velocidade do carro em km/h (ex:
"120")
Sua tarefa é:
- Definir uma interface
Vehiclecom uma assinatura de método:GetInfo()que retorna uma string - Definir uma struct
Carcom dois campos:Brand(string) eSpeed(int) - Implementar o método
GetInfo()para a structCarque retorna uma string no formato:"Brand: [brand], Speed: [speed] km/h" - Analisar as entradas para criar uma instância de
Car - Chamar o método
GetInfo()e imprimir o resultado
Lembre-se de que, em Go, a struct Car implementará automaticamente a interface Vehicle porque possui o método GetInfo() necessário com a assinatura correta. Não há necessidade de declarar explicitamente que Car implementa Vehicle - o Go reconhece esse relacionamento implicitamente.
Folha de consulta
Go utiliza implementação implícita para interfaces - nenhuma palavra-chave ou declaração especial é necessária.
Se um tipo possui todos os métodos que uma interface exige, ele satisfaz automaticamente essa interface:
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}Como o Circle possui um método Area() que retorna um float64, ele implementa automaticamente a interface Shaper sem uma declaração explícita.
Essa abordagem implícita torna as interfaces em Go flexíveis - qualquer tipo existente pode satisfazer uma nova interface, desde que possua os métodos exigidos, mesmo que a interface tenha sido criada após o tipo.
Experimente você mesmo
package main
import (
"fmt"
"strconv"
)
// TODO: 1. Defina a interface Vehicle com um método GetInfo() string
// TODO: 2. Defina a struct Car com os campos Brand (string) e Speed (int)
// TODO: 3. Implemente o método GetInfo() para Car
func main() {
// Ler a entrada
var brand string
var speedStr string
fmt.Scanln(&brand)
fmt.Scanln(&speedStr)
// Converter a string de velocidade para inteiro
speed, _ := strconv.Atoi(speedStr)
// TODO: 4. Crie uma instância de Car usando brand e speed, então chame GetInfo()
result := "" // substitua esta linha com sua implementação
_ = brand
_ = speed
// Exibir o resultado
fmt.Println(result)
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Fluxo de Controle Avançado
Switch com `fallthrough`Interrompendo Loops AninhadosContinuando um Loop EspecíficoA Instrução `goto`Recapitulação - Controle de Loop Avançado4Projeto: Lista de Tarefas Simples
Configuração do ProjetoAdicionando uma Tarefa2Structs e Métodos
Definindo Métodos em StructsRecebedores de ValorRecebedores de PonteiroEscolhendo RecebedoresMétodos vs FunçõesRecapitulação - Comportamento de Structs5Mapas em Profundidade
Mapas de StructsPonteiros como Valores de MapVerificando Mapas NilComparando MapasRecapitulação - Contador de Frequência de Palavras3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e Comportamentos