O que são structs e como usá-las

Muitas vezes utilizar somente os tipos primitivos de uma linguagem não é o suficiente para desenvolver um programa escalável. Na maioria das linguagens mais modernas, é nesse momento que criamos uma classe com todos os atributos e métodos que precisamos.

Em Go não existe o conceito de orientação a objetos, ou seja, não existem classes, herança, polimorfismo e etc… Então como fazemos quando precisamos trabalhar com estruturas de dados mais complexas?

Fácil, nós criamos uma struct.

Struct é um tipo de coleção de campos, onde cada campo tem seu tipo de dado, podendo inclusive ser uma outra struct. Vamos ver um exemplo básico.

type Pessoa struct {
    Nome string
    Sobrenome string
    Idade int8
}

Para utilizar essa struct, podemos fazer das seguintes formas:

pessoa1 := Pessoa{"Tiago", "Temporin", 31}

pessoa2 := Pessoa{Nome: "João", Sobrenome: "Silva", Idade: 35}

pessoa3 := Pessoa{Nome: "Aline", Idade: 25}

Como podemos ver acima, não é necessário colocar o nome do campo e seu valor, no entanto é recomendado, pois caso haja uma mudança na struct o valor passado pode ser atribuído a um campo errado.

Os campos das structs não aceitam valores padrão para quando nenhum valor for atribuído, porém se isso for necessário, podemos criar uma função para retornar nossa struct.

func NovaPessoa(nome, sobrenome string, idade int8) Pessoa {
    p := Pessoa{Nome: nome, Sobrenome: sobrenome, Idade: idade}
    if idade == 0 {
        p.Idade = 18
    }

    return p
}

Também podemos adicionar funções às structs.

type Pessoa struct {
    Nome string
    Sobrenome string
    Idade int8
}

func (p *Pessoa) NomeCompleto() string {
    return fmt.Sprintf("%s %s", p.Nome, p.Sobrenome)
}

Abaixo, um exemplo de como chamar a função NomeCompleto.

pessoa := NovaPessoa("Paula", "Morais")
fmt.Println(pessoa.NomeCompleto()) // output: Paula Morais

No exemplo abaixo, vamos modificar a struct Pessoa adicionando mais um campo para guardar os endereços que a pessoa pode ter.

type Pessoa struct {
    Nome string
    Sobrenome string
    Idade int8
    Enderecos []Endereco
}

func (p *Pessoa) NomeCompleto() string {
    return fmt.Sprintf("%s %s", p.Nome, p.Sobrenome)
}

func (p *Pessoa) AdicionarEndereco(endereco Endereco) {
    p.Enderecos = append(p.Enderecos, endereco)
}

type Endereco struct {
    Rua string
    Complemento string
    Tipo string
}

Deixem suas dúvidas nos comentários.

Até a próxima!


Se inscreva na nossa newsletter

* indicates required

Deixe uma resposta