Fácil Go
Embedding básico
Enunciado
Crie uma struct Pessoa com campos Nome e Idade. Depois, crie uma struct Funcionario que embuta Pessoa e tenha um campo Cargo. No main, instancie um Funcionario e imprima o nome, a idade e o cargo usando os campos promovidos.
Requisitos
- A struct
Funcionariodeve embutirPessoa(não como campo nomeado). - A instância de
Funcionariodeve ser criada com valores para todos os campos. - A saída deve mostrar nome, idade e cargo.
Código inicial
package main
import "fmt"
// Defina Pessoa e Funcionario aqui
func main() {
// Crie um Funcionario e imprima os dados
}
Saída esperada
Nome: Ana
Idade: 30
Cargo: Engenheira
Ver dica
Para embutir, declare o tipo sem nome de campo: Pessoa dentro de Funcionario. Os campos Nome e Idade ficam acessíveis diretamente.
Mostrar solução
package main
import "fmt"
type Pessoa struct {
Nome string
Idade int
}
type Funcionario struct {
Pessoa // embedding
Cargo string
}
func main() {
f := Funcionario{
Pessoa: Pessoa{Nome: "Ana", Idade: 30},
Cargo: "Engenheira",
}
// Acessando campos promovidos
fmt.Println("Nome:", f.Nome)
fmt.Println("Idade:", f.Idade)
fmt.Println("Cargo:", f.Cargo)
}
Passo a passo
- Definimos a struct
Pessoacom os camposNomeeIdade. - Criamos a struct
Funcionarioque embutePessoa(sem nome de campo) e adicionaCargo. - No
main, instanciamosFuncionariousando a sintaxe de struct literal, preenchendo o campo embutidoPessoae o campoCargo. - Acessamos
f.Nomeef.Idadediretamente, pois são promovidos do tipo embutido. - Imprimimos os valores com
fmt.Println.
Por que funciona
O embedding promove os campos do tipo embutido para o tipo externo. Assim, f.Nome é uma forma abreviada de f.Pessoa.Nome. Isso simplifica o acesso e mantém a composição clara.
Erros comuns
- Declarar como campo nomeado:
Pessoa Pessoaem vez dePessoa. Isso não promove os campos; você teria que acessarf.Pessoa.Nome. - Esquecer de inicializar o campo embutido: se criar
Funcionario{Cargo: "Engenheira"}, o campoPessoafica com valores zero. UseFuncionario{Pessoa: Pessoa{...}, Cargo: ...}. - Tentar acessar campo inexistente:
f.Idadefunciona, mas sePessoanão tivesseIdade, daria erro de compilação.
Outra forma de resolver
Poderia usar um campo nomeado e acessar via f.Pessoa.Nome, mas perde a promoção e a conveniência.
Saída esperada
Nome: Ana
Idade: 30
Cargo: Engenheira