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 Funcionario deve embutir Pessoa (não como campo nomeado).
  • A instância de Funcionario deve 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

  1. Definimos a struct Pessoa com os campos Nome e Idade.
  2. Criamos a struct Funcionario que embute Pessoa (sem nome de campo) e adiciona Cargo.
  3. No main, instanciamos Funcionario usando a sintaxe de struct literal, preenchendo o campo embutido Pessoa e o campo Cargo.
  4. Acessamos f.Nome e f.Idade diretamente, pois são promovidos do tipo embutido.
  5. 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 Pessoa em vez de Pessoa. Isso não promove os campos; você teria que acessar f.Pessoa.Nome.
  • Esquecer de inicializar o campo embutido: se criar Funcionario{Cargo: "Engenheira"}, o campo Pessoa fica com valores zero. Use Funcionario{Pessoa: Pessoa{...}, Cargo: ...}.
  • Tentar acessar campo inexistente: f.Idade funciona, mas se Pessoa não tivesse Idade, 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