Qual a diferença entre valor e referência (ponteiro)

Hoje vamos abordar um tema muito interessante e que é comum a quase todas as linguagens, valor vs referência (também conhecida como ponteiro).

Primeiramente, não podemos nos esquecer que, cada variável que criamos, independente do seu tipo, assim como arrays, slices e maps, são espaços alocados em memória.

Outro ponto importante que temos que ter em mente é que, os parâmetros de uma função também são variáveis.

Para ajudar na explicação, vamos criar uma função com 2 parâmetros, onde o primeiro espera um valor e o segundo um ponteiro.

func ValPoint(valor string, ponteiro *string) {
    fmt.Println(valor)
    fmt.Println(ponteiro)
}
Leia mais »

Trabalhando com variáveis

Embora pareça um assunto sem muito conteúdo, é muito importante saber alguns detalhes de como trabalhar com variáveis em Go.

A primeira coisa que precisamos saber sobre variáveis em Go, é que elas tem escopo, ou seja, dependendo de onde ela for criada você estará limitando os locais em que ela estará disponível.

No exemplo abaixo, vamos criar 3 variáveis com 3 escopos diferentes.

var connection = database.Connect()

func Insert(data interface{}) string {
    err := connection.Create(data)
    if err != nil {
        msg := fmt.Sprintf("falha ao tentar inserir: %v", err)
        return msg
    }

    return "inserido com sucesso sucesso!"
}

connection: Essa variável tem um escopo global, ou seja, estará disponível para ser utilizada em qualquer parte do package onde ela foi criada.

Leia mais »