Se quiser copiar o código do PIX:

00020126580014BR.GOV.BCB.PIX013643c5f950-535b-4658-b91f-1f1d135fe4105204000053039865802BR5925Antonio Cavalcante de Pau6009SAO PAULO61080540900062070503***6304946B

Aula 18 - Tutorial Golang - Ponteiros

Ponteiros

Go oferece suporte a ponteiros, permitindo que você passe referências a valores e registros dentro de seu programa.

OBS. Aqui no código fluente, no curso de C, tem uma explicação ilustrativa e detalhada de como funciona ponteiros em C, que é muito similar a como funciona em Go.

Segue o link:

https://www.codigofluente.com.br/aula-24-ponteiro-algoritmo-em-c/ 

Mostraremos como os ponteiros funcionam vendo um exemplo usando ponteiro (zeroptr) e um passando o valor como cópia (zeroval). A zeroval recebe um parâmetro do tipo int, e os argumentos serão passados a ele por valor.

func zeroval(ival int) {
    ival = 0
    fmt.Println("(ZEROVAL) Guarda o valor em ival:", ival)
    fmt.Println("(ZEROVAL) &ival guarda o endereço de ival:", &ival)
}
A zeroval obterá uma cópia de ival distinta daquela na chamada da função, na main(). A zeroptr() tem um parâmetro * int, o que significa que recebe um ponteiro do tipo int. O código * iptr no corpo da função, remove a referência do ponteiro de seu endereço de memória para o valor atual naquele endereço. Atribuir um valor a um ponteiro não referenciado altera o valor no endereço referenciado.

func zeroptr(iptr *int) {
    *iptr = 0
    fmt.Println("(ZEROPTR) *iptr guarda o endereço de i:", iptr)
    fmt.Println("(ZEROPTR) &iptr guarda o endereço de iptr:", &iptr)
    fmt.Println("(ZEROPTR) *iptr guarda o valor que iptr aponta:", *iptr)
}
A sintaxe &i fornece o endereço de memória de i, ou seja, um ponteiro para i. Ponteiros também podem ser impressos.

func main() {
    i := 1
    fmt.Println("(MAIN) i inicial:", i)

    zeroval(i)
    fmt.Println("(MAIN) valor de i na main depois de chamar a zeroval:", i)

    zeroptr(&i)
    fmt.Println("(MAIN) valor alterado do i através da zeroptr:", i)

    fmt.Println("(MAIN) ponteiro para i:", &i)
}
O zeroval não muda o i na main(), mas zeroptr sim, porque tem uma referência ao endereço de memória para essa variável. A imagem abaixo ilustra no nosso código simplificado — sem alguns prints() — a diferença entre passagem de parâmetro para uma função, por valor e por referência de endereço de memória, usando ponteiro.

Código completo


package main

import "fmt"

func zeroval(ival int) {
    ival = 0
    fmt.Println("(ZEROVAL) Guarda o valor em ival:", ival)
    fmt.Println("(ZEROVAL) &ival guarda o endereço de ival:", &ival)
}

func zeroptr(iptr *int) {
    *iptr = 0
    fmt.Println("(ZEROPTR) *iptr guarda o endereço de i:", iptr)
    fmt.Println("(ZEROPTR) &iptr guarda o endereço de iptr:", &iptr)
    fmt.Println("(ZEROPTR) *iptr guarda o valor que iptr aponta:", *iptr)vvvvv
}

func main() {
    i := 1
    fmt.Println("(MAIN) i inicial:", i)

    zeroval(i)
    fmt.Println("(MAIN) valor de i na main depois de chamar a zeroval:", i)

    zeroptr(&i)
    fmt.Println("(MAIN) valor alterado do i através da zeroptr:", i)

    fmt.Println("(MAIN) ponteiro para i:", &i)
}

E pra executar é só entrar na pasta onde tá o arquivo pointers.go

go run pointers.go

Saída:

(MAIN) i inicial: 1 (ZEROVAL) Guarda o valor em ival: 0 (ZEROVAL) &ival guarda o endereço de ival: 0xc0000140c0 (MAIN) valor de i na main depois de chamar a zeroval: 1 (ZEROPTR) *iptr guarda o endereço de i: 0xc000014098 (ZEROPTR) &iptr guarda o endereço de iptr: 0xc000006030 (ZEROPTR) *iptr guarda o valor que iptr aponta: 0 (MAIN) valor alterado do i através da zeroptr: 0 (MAIN) ponteiro para i: 0xc000014098 

É isso pessoal, fico por aqui.

Página principal do blog

página do Código Fluente no Facebook

Esse é o link do código fluente no Pinterest

Meus links de afiliados:

Hostinger

Digital Ocean

One.com

Obrigado e bons estudos. ;)