Definindo Métodos em Structs
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 7 de 107.
Métodos em Go são funções com um argumento receptor especial que associa a função a um tipo struct.
Sintaxe de método
func (receiverName StructType) MethodName() ReturnType {
// corpo do método
}Defina uma struct com métodos
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}Métodos com parâmetros
func (r Rectangle) Scale(factor float64) float64 {
return r.Area() * factor
}Chamando métodos
rect := Rectangle{Width: 5, Height: 3}
fmt.Println(rect.Area()) // Saída: 15
fmt.Println(rect.Perimeter()) // Saída: 16
fmt.Println(rect.Scale(2)) // Saída: 30O receptor (r Rectangle) permite acessar os campos da struct dentro do método usando a variável do receptor r. Métodos podem chamar outros métodos na mesma struct.
Desafio
MédioAdicione três métodos à struct Circle:
Area— retornamath.Pi * radius * radiusCircumference— retorna2 * math.Pi * radiusDescribe— retorna uma string:"Circle with radius X.XX"
Folha de consulta
Métodos em Go são funções com um argumento receiver (receptor) especial que associa a função a um tipo struct.
Sintaxe do método:
func (receiverName StructType) MethodName() ReturnType {
// method body
}Exemplo com uma struct e métodos:
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}Métodos podem aceitar parâmetros:
func (r Rectangle) Scale(factor float64) float64 {
return r.Area() * factor
}Chamando métodos:
rect := Rectangle{Width: 5, Height: 3}
fmt.Println(rect.Area()) // Output: 15
fmt.Println(rect.Perimeter()) // Output: 16
fmt.Println(rect.Scale(2)) // Output: 30O receiver permite que você acesse os campos da struct dentro do método. Métodos podem chamar outros métodos na mesma struct.
Experimente você mesmo
package main
import "fmt"
func main() {
var radius float64
fmt.Scan(&radius)
c := Circle{Radius: radius}
fmt.Printf("Area: %.2f\n", c.Area())
fmt.Printf("Circumference: %.2f\n", c.Circumference())
fmt.Printf("Description: %s\n", c.Describe())
}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