Golang: Structs (Parte - 9)

Golang

O que são Structs?

Structs são tipos compostos que permitem agrupar diferentes tipos de dados sob um mesmo nome. Elas são úteis para representar entidades complexas, como uma pessoa, um carro ou um produto.

As structs são semelhantes às classes em outras linguagens de programação.

Segue um exemplo simples. O código está comentado explicando o que cada parte faz.

package main

import "fmt"

// Definindo uma struct
type Pessoa struct {
    Nome   string
    Idade  int
    Cidade string
}

func main() {
    // Criando uma instância da struct
    p1 := Pessoa{
        Nome:   "Lucas",
        Idade:  25,
        Cidade: "São Paulo",
    }

    // Acessando os campos da struct
    fmt.Println("Nome:", p1.Nome)
    fmt.Println("Idade:", p1.Idade)
    fmt.Println("Cidade:", p1.Cidade)

    // Modificando um campo da struct
    p1.Idade = 26
    fmt.Println("Idade atualizada:", p1.Idade)

    // Criando uma slice de structs
    pessoas := []Pessoa{
        {"Wesley", 30, "Rio de Janeiro"},
        {"Tinta", 28, "Belo Horizonte"},
    }

    // Iterando sobre a slice de structs
    for _, pessoa := range pessoas {
        fmt.Printf("Nome: %s, Idade: %d, Cidade: %s\n", pessoa.Nome, pessoa.Idade, pessoa.Cidade)
    }
}

Composição

Por enquando está simples, nada demais. Agora vamos ver como compor várias structs.

As structs podem conter outras structs como campos, permitindo criar estruturas de dados mais complexas. Isso é conhecido como composição.

package main
import "fmt"

type Endereco struct {
    Rua    string
    Cidade string
}

type Pessoa struct {
    Nome     string
    Idade    int
    Endereco Endereco
}

func main() {
    // Criando uma instância da struct
    p1 := Pessoa{
        Nome:  "Lucas",
        Idade: 25,
        Endereco: Endereco{
            Rua:    "Rua A",
            Cidade: "São Paulo",
        },
    }

    // Acessando os campos da struct
    fmt.Println("Nome:", p1.Nome)
    fmt.Println("Idade:", p1.Idade)
    fmt.Println("Rua:", p1.Endereco.Rua)
    fmt.Println("Cidade:", p1.Endereco.Cidade)
}

Métodos

As structs também podem ter métodos associados a elas.

É bem simples, seja o exemplo:

package main
import "fmt"

type Pessoa struct {
    Nome  string
    Idade int
}

func (p Pessoa) Apresentar() {
    fmt.Printf("Olá, meu nome é %s e tenho %d anos.\n", p.Nome, p.Idade)
}

func main() {
    p1 := Pessoa{
        Nome:  "Lucas",
        Idade: 25,
    }

    // Chamando o método da struct
    p1.Apresentar()
}

Explicando o código:

  • Definimos uma struct Pessoa com os campos Nome e Idade.
  • Criamos um método Apresentar associado à struct Pessoa. Associamos o método à struct usando (p Pessoa), onde p é o receptor do método.
  • Dentro do método, usamos p.Nome e p.Idade para acessar os campos da struct.
  • No main, criamos uma instância da struct Pessoa e chamamos o método Apresentar.
  • O método imprime uma mensagem apresentando a pessoa.

Só isso. Cria uma função e associa ela a uma struct dessa maneira.