Menu
Coddy logo textTech

Structs Aninhadas

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 16 de 107.

Uma struct aninhada é uma struct que contém outra struct nomeada como um de seus campos. Isso permite modelar dados complexos e hierárquicos compondo tipos menores e reutilizáveis juntos.

type Address struct {
    Street string
    City   string
    ZIP    string
}

type Person struct {
    Name    string
    Age     int
    Address Address  // struct aninhada
}

Para acessar campos em uma struct aninhada, você encadeia os nomes dos campos com pontos.

p := Person{
    Name: "Alice",
    Age:  30,
    Address: Address{
        Street: "123 Main St",
        City:   "Boston",
        ZIP:    "02101",
    },
}

fmt.Println(p.Address.City) // Boston

O aninhamento promove a reutilização de código. O tipo Address pode ser usado em múltiplas structs como Person, Company ou Order sem duplicar campos. Essa abordagem reflete relacionamentos do mundo real onde entidades contêm outras entidades.

type Company struct {
    Name      string
    Employees int
    Address   Address  // mesmo tipo Address reutilizado
}

Você pode aninhar structs em vários níveis de profundidade, embora manter as hierarquias rasas melhore a legibilidade. Structs aninhadas são fundamentais para construir modelos de dados orientados a objetos em Go.

challenge icon

Desafio

Fácil

Vamos construir um sistema de gerenciamento de funcionários que demonstra como structs aninhadas ajudam a modelar hierarquias do mundo real. Você criará uma estrutura onde os funcionários pertencem a departamentos, e os departamentos possuem informações de localização.

Você organizará seu código em dois arquivos:

  • models.go: Defina três structs que trabalham juntas:
    • Location com os campos Building (string) e Floor (int)
    • Department com o campo Name (string) e um campo Location aninhado
    • Employee com os campos ID (int), Name (string) e um campo Department aninhado
  • main.go: Leia as informações do funcionário a partir da entrada, crie um Employee com as structs devidamente aninhadas e exiba o perfil completo do funcionário acessando os campos através da estrutura aninhada.

As seguintes entradas serão fornecidas:

  • Linha 1: ID do funcionário (inteiro)
  • Linha 2: Nome do funcionário
  • Linha 3: Nome do departamento
  • Linha 4: Nome do edifício
  • Linha 5: Número do andar (inteiro)

Formato de saída:

Employee: [Name] (ID: [ID])
Department: [DepartmentName]
Location: [Building], Floor [Floor]

Por exemplo, dados 101, Alice Chen, Engineering, Tower A e 5, sua saída deve ser:

Employee: Alice Chen (ID: 101)
Department: Engineering
Location: Tower A, Floor 5

Acesse os campos aninhados usando a notação de ponto para encadear a hierarquia da struct (ex: employee.Department.Location.Building).

Folha de consulta

Uma struct aninhada é uma struct que contém outra struct nomeada como um de seus campos, permitindo modelar dados hierárquicos compondo tipos menores e reutilizáveis.

Definindo Structs Aninhadas

type Address struct {
    Street string
    City   string
    ZIP    string
}

type Person struct {
    Name    string
    Age     int
    Address Address  // struct aninhada
}

Acessando Campos Aninhados

Use a notação de ponto para encadear através da hierarquia da struct:

p := Person{
    Name: "Alice",
    Age:  30,
    Address: Address{
        Street: "123 Main St",
        City:   "Boston",
        ZIP:    "02101",
    },
}

fmt.Println(p.Address.City) // Boston

Reutilizando Structs Aninhadas

O mesmo tipo de struct aninhada pode ser reutilizado em várias structs pai:

type Company struct {
    Name      string
    Employees int
    Address   Address  // mesmo tipo Address reutilizado
}

Structs aninhadas promovem a reutilização de código e espelham relacionamentos do mundo real onde entidades contêm outras entidades. Você pode aninhar structs em vários níveis de profundidade, embora manter as hierarquias rasas melhore a legibilidade.

Experimente você mesmo

package main

import "fmt"

func main() {
	// Ler informações do funcionário
	var id int
	var name string
	var deptName string
	var building string
	var floor int

	fmt.Scanln(&id)
	fmt.Scanln(&name)
	fmt.Scanln(&deptName)
	fmt.Scanln(&building)
	fmt.Scanln(&floor)

	// TODO: Criar um Employee com structs devidamente aninhadas
	// Use as structs Location, Department e Employee de models.go
	// Inicialize todos os campos aninhados com os valores de entrada

	// TODO: Imprimir o perfil do funcionário usando o formato:
	// Employee: [Name] (ID: [ID])
	// Department: [DepartmentName]
	// Location: [Building], Floor [Floor]
	// Acesse campos aninhados usando a notação de ponto (ex: employee.Department.Location.Building)
}
quiz iconTeste seus conhecimentos

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