Struct Embedding
Go não tem herança de classes. Em vez disso, você incorpora um struct dentro de outro listando seu tipo sem nome de campo — o tipo externo automaticamente ganha acesso direto aos fields e methods do tipo incorporado, um padrão chamado promotion.
package main
import "fmt"
type Animal struct {
Name string
}
func (a Animal) Describe() string {
return a.Name + " is an animal"
}
type Dog struct {
Animal
Breed string
}
func main() {
d := Dog{Animal: Animal{Name: "Rex"}, Breed: "Labrador"}
fmt.Println(d.Name)
fmt.Println(d.Describe())
}Rex Rex is an animal
Sobrescrevendo um method promovido
d.Name e d.Describe() acima são promovidos diretamente do Animal incorporado, sem precisar de código extra. Um tipo também pode definir seu próprio method com o mesmo nome para ter precedência sobre o incorporado, ainda assim chamando-o explicitamente, como Derived.Label faz abaixo.
package main
import "fmt"
type Base struct {
ID int
}
func (b Base) Label() string {
return fmt.Sprintf("Base#%d", b.ID)
}
type Derived struct {
Base
Name string
}
func (d Derived) Label() string {
return fmt.Sprintf("%s (%s)", d.Base.Label(), d.Name)
}
func main() {
d := Derived{Base: Base{ID: 7}, Name: "widget"}
fmt.Println(d.Label())
}Base#7 (widget)
A seguir: a standard library — alguns pacotes comumente usados, e um olhar final sobre o que mais a standard library do Go oferece.
Practice exercise
Defina um struct Vehicle com o campo Wheels int. Defina um struct Car que incorpora Vehicle e adiciona um campo Brand string. Crie um Car com Wheels 4 e Brand "Toyota", depois imprima car.Wheels e car.Brand.