Introdução a OOP em Go
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 5 de 107.
Go não possui classes, mas alcança a programação orientada a objetos através de structs e methods. Uma struct agrupa dados relacionados, e methods definem o comportamento associado a essa struct.
Defina uma struct para armazenar dados
type Dog struct {
Name string
Age int
}Anexe um método à struct
func (d Dog) Bark() string {
return d.Name + " says Woof!"
}Crie uma instância e use-a
package main
import "fmt"
type Dog struct {
Name string
Age int
}
func (d Dog) Bark() string {
return d.Name + " says Woof!"
}
func main() {
myDog := Dog{Name: "Buddy", Age: 3}
fmt.Println(myDog.Bark()) // Saída: Buddy says Woof!
fmt.Println(myDog.Age) // Saída: 3
}Em Go, a parte (d Dog) antes do nome do método é chamada de receptor (receiver). Ela conecta o método à struct Dog, de forma semelhante a como métodos pertencem a classes em outras linguagens.
Desafio
FácilCrie uma struct Cat com um método para praticar a abordagem de OOP do Go:
- Defina uma struct
Catcom os camposName(string) eAge(int) - Adicione um método
Speakque retorna o nome do gato seguido por" says Meow!"
Folha de consulta
Go alcança a programação orientada a objetos através de structs e métodos. Uma struct agrupa dados relacionados, e métodos definem o comportamento anexado a essa struct.
Defina uma struct para conter dados:
type Dog struct {
Name string
Age int
}Anexe um método à struct usando um receiver:
func (d Dog) Bark() string {
return d.Name + " says Woof!"
}A parte (d Dog) antes do nome do método é o receiver, que conecta o método à struct.
Crie uma instância e use-a:
myDog := Dog{Name: "Buddy", Age: 3}
fmt.Println(myDog.Bark()) // Saída: Buddy says Woof!
fmt.Println(myDog.Age) // Saída: 3Experimente você mesmo
package main
import "fmt"
func main() {
var name string
var age int
fmt.Scan(&name, &age)
cat := Cat{Name: name, Age: age}
fmt.Printf("Name: %s\n", cat.Name)
fmt.Printf("Age: %d\n", cat.Age)
fmt.Println(cat.Speak())
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP em Go
Arquivos ExternosGo Workspace e MódulosPacotes e ImportaçõesNomes Exportados vs Não ExportadosIntrodução a OOP em GoStructs como ClassesDefinindo Métodos em StructsRecebedores de Ponteiro vs ValorInicialização de StructsFunções ConstrutorasRecapitulação - Calculadora Simples4Interfaces
Introdução a InterfacesImplementação ImplícitaInterface como ContratoInterface Vazia (any)Type AssertionType SwitchComposição de InterfacesInterfaces Stringer & ErrorRecapitulação - Calculadora de Formas7Encapsulamento
Campos Exportados vs Não ExportadosEncapsulamento em Nível de PacoteMétodos Getter e SetterOcultação de Informação em GoRecapitulação - Registros de Estudantes10Generics (Go 1.18+)
Introdução a GenericsParâmetros de TipoRestrições de TipoStructs GenéricasSolução Alternativa para Métodos GenéricosRecapitulação - Coleção Genérica2Mergulho Profundo em Tipos e Structs
Tipos Básicos e CompostosDefinições de Tipos PersonalizadosStruct TagsStructs AnônimasStructs AninhadasZero Values e PadrõesRecapitulação - Agenda de Contatos5Composição em vez de Herança
Por que Go não possui HerançaFundamentos de Incorporação de StructsPromoção de MétodosIncorporando Múltiplas StructsIncorporação vs AgregaçãoShadowing de Métodos IncorporadosRecapitulação - Hierarquia de Funcionários8Tratamento de Erros e OOP
A Interface errorTipos de Erro PersonalizadosError Wrapping (fmt.Errorf)Erros Sentinelaerrors.Is() e errors.As()Panic, Defer e RecoverRecapitulação - File Parser3Ponteiros e Memória
Fundamentos de Ponteiros em GoPonteiros para StructsPassagem por Valor vs ReferênciaA Função new()Garbage Collection em GoRecapitulação - Construtor de Lista Encadeada6Polimorfismo em Go
Polimorfismo via InterfacesDuck Typing em GoRegras de Satisfação de InterfaceColeções PolimórficasInjeção de DependênciaRecapitulação - Processador de Pagamentos9Concorrência e OOP
Fundamentos de GoroutinesCanais e ComunicaçãoCanais com Buffer vs. Sem BufferInstrução Selectsync.Mutex e sync.RWMutexsync.WaitGroupDesign de Structs Thread-SafeRecapitulação - Worker Pool