Rafael Henrique da Silva Correia Pythonista, Gopher, Linuxista, Gamer, Devopeiro e bebedor de Cerveja
Published

janeiro 06, 2018

←Home

Ponteiros são legais

A pouco comecei a estudar a linguagem Go e como comecei bem no nível iniciante eu estou estudando os tipos e as estruturas de dados da linguagem. Achei bem legal o funcionamento da passagem de valor para as funções, TODO valor passado por padrão para uma função não altera o "objeto" original. Hein? Não entendeu? Vamos lá...

Exemplo de passagem de valores para uma função

Imagine que você vai fazer uma função bem bobinha que incrementa números, você teria algo assim:

package main

import "fmt"

func main() {
    number := 10
    fmt.Printf("number: %p - %+v\n", &number, number)

    number = increment(number, 10)

    fmt.Printf("number: %p - %+v\n", &number, number)
}

func increment(number int, numberIncrement int) int {
    number = number + numberIncrement
    return number
}

Executando este código teríamos uma saída assim:

number: 0xc42001c0d0 - 10
number: 0xc42001c0d0 - 20

Usei o %p para exibir o endereço de memória da variável number. Agora veja que curioso quando exibimos o endereço de memória dentro da função increment:

package main

import "fmt"

func main() {
    number := 10
    fmt.Printf("number: %p - %+v\n", &number, number)

    number = increment(number, 10)

    fmt.Printf("number: %p - %+v\n", &number, number)
}

func increment(number int, numberIncrement int) int {
    number = number + numberIncrement
    fmt.Printf("increment: %p\n", &number)
    return number
}

Saída:

number: 0xc42001c0d0 - 10
increment: 0xc42001c0e8
number: 0xc42001c0d0 - 20

Ou seja, o compilador criará uma nova variável em um novo endereço de memória realizará o cálculo dentro da função increment SEM ALTERAR o valor original da variável number que está na função main. Bem interessante isso né?

Como fazer com que o Go use a mesma variável e economize memória?

A resposta é simples, ponteiros! E o uso também é muito simples, apesar de o conceito de ponteiros assustar muita gente que aprendeu C no passado :D.

Vamos dar uma pequena mudada no programinha:

package main

import "fmt"

func main() {
    number := 10
    fmt.Printf("number: %p - %+v\n", &number, number)

    increment(&number, 10)

    fmt.Printf("number: %p - %+v\n", &number, number)
}

func increment(number *int, numberIncrement int) {
    *number = *number + numberIncrement
    fmt.Printf("increment: %p\n", number)
}

Agora mudamos, não vamos mais mandar o valor de number, mas vamos mandar o endereço de memória de number para a função increment, ou seja, passamos um ponteiro de number para a função increment. Fazendo isso a função irá incrementar o valor diretamente em number, no mesmo da função main.

Veja a execução do código acima:

number: 0xc42009a000 - 10
increment: 0xc42009a000
number: 0xc42009a000 - 20

Bacana né? Gostou? Deixa seu comentário ai ;)

Flw!

Go Top
comments powered by Disqus