Aula 18 – Tutorial Golang – Ponteiros
Aula 18 – Tutorial Golang – Ponteiros
Página principal do blog
Todas as aulas desse curso
Aula 17 Aula 19
Se gostarem do conteúdo dêem um joinha 👍 na 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
Melhore seu NETWORKING
https://digitalinnovation.one/
Participe de comunidades de desenvolvedores:
Fiquem a vontade para me adicionar ao linkedin.
E também para me seguir no https://github.com/toticavalcanti.
Código final da aula:
https://github.com/toticavalcanti
Toti:
https://www.youtube.com/channel/UCUEtjLuDpcOvR3mIUr-viOA
Backing track / Play-along:
https://www.youtube.com/channel/UCT3TryVMqTqYBjf5g5WAHfA
Código Fluente
https://www.youtube.com/channel/UCgn-O-88XBAwdG9gUWkkb0w
Putz!
https://www.youtube.com/channel/UCZXop2-CECwyFYmHbhnAkAw
PIX para doações
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