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:
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 do Código Fluente no
Facebook
Esse é o link do código fluente no Pinterest
Meus links de afiliados:
Obrigado e bons estudos. ;)