🚀 Capítulo 05: Blocos de Lego (Tema: Lego)

NOTE

Este capítulo utiliza a temática de Lego para explicar as Structs e Interfaces em Go. Monte os seus tipos de dados juntando peças menores, sem a complexidade de classes e herança!


1. 🎯 Objetivo da Aula

Compreender o conceito de Structs (Estruturas de Dados), como Go alcança a organização de objetos sem usar classes ou herança, e uma introdução às Interfaces.

2. 🏢 O Cenário Prático (Seu Desafio)

Imagine que você está brincando com blocos de Lego. Se você quiser criar um “Carro de Polícia”, você não tem um molde de plástico fechado e inquebrável de um carro. Você pega um bloco que serve de chassi, encaixa quatro blocos de rodas, coloca um bloco de volante e uma pecinha azul e vermelha em cima para ser a sirene. Você compõe o objeto juntando partes menores!

No desenvolvimento de software tradicional (como em Java ou C++), nós usamos “Classes” e “Herança” para criar objetos. Mas o Go achou isso muito complexo e preferiu seguir a filosofia do Lego!

  • No Go, não existe a palavra-chave class!
  • Nós usamos Structs para criar moldes de dados e juntamos peças menores para formar objetos complexos. Seu desafio é montar o seu Lego!

🧠 Fundamentos: A Teoria Traduzida

🧱 1. O que é uma Struct?

Uma struct (estrutura) é uma coleção de variáveis (campos) agrupadas sob um único nome. É a forma de criarmos o nosso próprio tipo de dado!

type Heroi struct {
    Nome      string
    Poder     string
    NivelForca int
}
classDiagram
    class Heroi {
        string Nome
        string Poder
        int NivelForca
        +GritarPoder()
    }

Para usar essa struct e criar um herói de verdade (uma instância):

homemDeFerro := Heroi{
    Nome:      "Tony Stark",
    Poder:     "Armadura Tecnológica",
    NivelForca: 95,
}

🔌 2. E os Métodos?

Em outras linguagens, as funções ficam dentro da classe. Em Go, nós criamos a função fora e dizemos a qual Struct ela pertence (isso se chama Receiver):

func (h Heroi) GritarPoder() {
    fmt.Println("Eu uso meu poder de", h.Poder)
}

4. 📖 Exemplo Guiado: O Robô de Lego

Vamos criar uma Struct para um robô e um método para ele falar:

package main
 
import "fmt"
 
type Robo struct {
    Nome string
    Cor  string
}
 
func (r Robo) Apresentar() {
    fmt.Println("Olá, eu sou o robô", r.Nome, "e minha cor é", r.Cor)
}
 
func main() {
    meuRobo := Robo{Nome: "R2-D2", Cor: "Azul e Branco"}
    meuRobo.Apresentar()
}

5. 🛠️ Prática Obrigatória 1: Criando a sua Struct

  1. Crie uma Struct chamada Carro com três campos: Marca (string), Modelo (string) e Ano (int).
  2. Dentro da função main, crie uma variável chamada meuCarro preenchendo os dados do seu carro dos sonhos usando essa Struct.

6. 🛠️ Prática Obrigatória 2: Adicionando uma Ação

  1. Crie um método para a Struct Carro chamado Acelerar. Esse método não recebe parâmetros, apenas imprime na tela a frase: "O carro [Marca] [Modelo] fez VRUMMM!".

7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

  1. Faça o Commit: No GitHub Desktop, digite a mensagem (ex: Finaliza Capítulo 05 Go_Lego) e clique em Commit to main.
  2. Envie para a Nuvem (Push): Clique em Push origin.

8. 📂 Estrutura de Pastas

spec_backend_com_golang_e_gin/
├── capitulos/
│   └── capitulo_05_lego.md

💡 Checkpoint de Lógica

Em Go, se o nome do campo da Struct começar com letra Maiúscula (ex: Nome), ele é público e pode ser visto por outros arquivos. Se começar com letra minúscula (ex: nome), ele é privado!

10. 🔥 Desafio de Fixação

Pesquise o que é uma Interface em Go e como ela permite que Structs diferentes (como um Carro e uma Moto) usem o mesmo método Acelerar.

🔑 Gabarito de Código/Fórmulas

Gabarito da Prática 1:

type Carro struct {
    Marca  string
    Modelo string
    Ano    int
}
 
// Dentro da main:
meuCarro := Carro{Marca: "Ferrari", Modelo: "Roma", Ano: 2023}

Gabarito da Prática 2:

func (c Carro) Acelerar() {
    fmt.Println("O carro", c.Marca, c.Modelo, "fez VRUMMM!")
}

Capitulo Anterior | Proximo Capitulo