AnyCompiler

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())
}
Output
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())
}
Output
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.