Golang básico - Tipos de dados

bgskurono

Bruno Gomes

Posted on May 19, 2022

Golang básico - Tipos de dados

Esse post faz parte de uma série onde pretendo compartilhar o básico essencial para desenvolver com GoLang.

Nos últimos posts nós vimos que variáveis e constantes possuem tipos de dados. Esse é um conceito muito importante, ainda mais se tratando de uma linguagem compilada e fortemente tipada como é o caso do Go.

Tipos embutidos

Os tipos que veremos agora, são tipos embutidos do Go, na realidade eles são frequentes em diversas linguagens, saber de existência deles e como manipulá-los é importante na jornada da programação.

Categoria Tipos e definição
Booleanos bool é tipo mais básico e só tem dois possíveis valores true e false, voltaremos nele em controle de fluxos
Numéricos int32, float32, byte são provavelmente os tipos numéricos mais comuns, eles são representações numéricas utilizadas para operações aritméticas.
Strings string é a representação de textos, mas uma definição técnica mais interessante: é uma sequencia de caracteres

Um ponto importante, em Go todos esses tipos embutidos tem uma natureza primitiva!

Esses são alguns dos tipos, para saber mais utilize esses links:

Tipos de estrutura

Estruturas ou simplesmente struct, é o que nos possibilita criar tipos mais complexos (no bom sentido) para atender as necessidades e regras do nossos sistemas.

Se você olhar para a implementação do Go, vai ver que os tipos complexos são definidos com struct, por exemplo:

  • array - Sequencia de dados, veremos nos posts seguintes.
  • list - Uma implementação de uma lista duplamente ligada, podemos falar disso futuramente.

Exemplo prático com struct

Para ilustrar como elas são definidas, vamos complementar o exemplo do último post, era um produto que possuía cor e status:

package main

import (
    "fmt"
    "time"
)

type (
    cor    string
    status int
)

const (
    vermelho cor = "#ff0000"
    verde    cor = "#00ff00"
    azul     cor = "#0000ff"
)

const (
    rascunho status = iota + 1
    publicado
    congelado
    deletado
)

type produto struct {
    nome   string
    cor    cor
    status status
    criado time.Time
}

func main() {
    p := produto{
        nome:   "Produto Teste",
        cor:    verde,
        status: publicado,
        criado: time.Now(),
    }
    fmt.Println(p)
    fmt.Println(p.criado.Format(time.RFC3339))
}
Enter fullscreen mode Exit fullscreen mode

No exemplo eu estou criando o tipo produto, ele possui o nome, sendo um tipo embutido string, cor e status que nós criamos no exemplo passado, e um tipo extra time.Time que é a representação de tempo/datas no Go.
Eu coloquei ela de propósito, para novamente citar que os tipos embutidos possuem uma natureza primitiva pois é só a representação de um valor, enquanto tipos complexos, como é o caso do Time, vai te fornecer atributos e uma série de comportamentos, por exemplo o método Format que eu usei acima.

Struct é classe do Go?

Resposta curta: Não!
Se você já tem experiência com alguma linguagem orientada a objetos (java, c#, php) pode acabar associando strucs com classes, o que não é um problema em si, mas pode te levar a armadilha de achar que Go é orientado a objetos.
Sempre que eu penso em classe, a definição que tenho em mente é a seguinte: é a receita de um objeto, quando instanciada te fornece estado e comportamento. E structs não funcionam exatamente assim.

Go tem um estilo próprio

Na minha interpretação, Go tem a filosofia de ser uma linguagem bastante simplificada. E a definição que eu tenho em mente para o paradigma do Go é uma linguagem procedural com elementos de OO. O mais importante dessa reflexão, é que se você pretende codificar em Go, entenda que ela tem um estilo próprio, que é bastante simples na verdade.
Deixo como sugestão essa palestra: Simplicity is Complicated

Então POO é complicada e desnecessária?

Na minha humilde opinião, a resposta é não. Eu só interpreto isso como uma decisão de design da linguagem, por simplicidade Go não é OO e ponto.
Minha dica se você é iniciante, e está entrando nesse universo de programação agora, quanto mais você aprender é melhor, isso vale para paradigmas, linguagens, frameworks, etc. E se você tiver oportunidade de estudar OO, faça isso. Domine os pilares encapsulamento, herança, interfaces e polimorfismo, isso vai te ajudar em qualquer linguagem, inclusive em Go.

Tipos de referência

Vimos os tipos embutidos e os tipos de estruturas. Por último vou mencionar rapidamente os tipos de referência, e será breve pois todos eles merecem posts exclusivos, pois possuem bastante particularidades.

Tipo Definição
Slice Slices são simplesmente sequencias (arrays) dinâmicos
Map Estrutura de dados super importante, entenda como um dicionário de dados representados por chaves e valores
Interface É a abstração para um comportamento, o exemplo mais simples de Go: Reader
Funções Funções em Go também funcionam como tipos, por hora se lembre que funções também são tipos de referencia
Channel E estrutura de dados utilizada para comunicação entre goroutines em sistemas concorrentes, essa definição é mais do que suficiente por agora.

Uma coisa que todos esses tipos tem em comum: ponteiro.
Isso pode soar um pouco assustador, e te levar ao passado com C e C++, mas lembre-se Go é uma linguagem moderna, apesar de você ter o conceito de ponteiros, eles são bastante simples de usar e tem uma boa justifica para existir. Mas vamos deixar para um próximo post.

Resumo

  • Tipos embutidos (string, int, float, bool) são primitivos.
  • struct nos permite criar tipos complexos.
  • struct != class
  • POO é importante
  • Tipos de referência: slices, maps, interfaces, funções e channels.
  • Go tem o conceito de ponteiros.
💖 💪 🙅 🚩
bgskurono
Bruno Gomes

Posted on May 19, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related