Compreensão de Ponteiros em Golang

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Este laboratório testará sua compreensão de ponteiros em Golang. Ponteiros são usados para passar referências a valores e registros dentro do seu programa.

Ponteiros

O problema é entender como os ponteiros funcionam em contraste com os valores, com duas funções: zeroval e zeroptr. zeroval tem um parâmetro int, então os argumentos serão passados por valor. zeroval obterá uma cópia de ival distinta daquela na função de chamada. zeroptr, em contraste, tem um parâmetro *int, o que significa que ele recebe um ponteiro int. O código *iptr no corpo da função então desreferencia o ponteiro de seu endereço de memória para o valor atual nesse endereço. Atribuir um valor a um ponteiro desreferenciado altera o valor no endereço referenciado.

  • Você deve ter uma compreensão básica de Golang.
  • Você deve saber como definir e usar funções em Golang.
  • Você deve saber como usar ponteiros em Golang.
## `zeroval` não altera o `i` em `main`, mas
## `zeroptr` altera porque tem uma referência ao
## endereço de memória para essa variável.
$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100

Aqui está o código completo:

// Go suporta <em><a href="https://en.wikipedia.org/wiki/Pointer_(computer_programming)">ponteiros</a></em>,
// permitindo que você passe referências a valores e registros
// dentro do seu programa.

package main

import "fmt"

// Vamos mostrar como os ponteiros funcionam em contraste com os valores com
// 2 funções: `zeroval` e `zeroptr`. `zeroval` tem um
// parâmetro `int`, então os argumentos serão passados por
// valor. `zeroval` obterá uma cópia de `ival` distinta
// daquela na função de chamada.
func zeroval(ival int) {
    ival = 0
}

// `zeroptr` em contraste tem um parâmetro `*int`, significando
// que ele recebe um ponteiro `int`. O código `*iptr` no
// corpo da função então _desreferencia_ o ponteiro de seu
// endereço de memória para o valor atual nesse endereço.
// Atribuir um valor a um ponteiro desreferenciado altera o
// valor no endereço referenciado.
func zeroptr(iptr *int) {
    *iptr = 0
}

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

    zeroval(i)
    fmt.Println("zeroval:", i)

    // A sintaxe `&i` fornece o endereço de memória de `i`,
    // ou seja, um ponteiro para `i`.
    zeroptr(&i)
    fmt.Println("zeroptr:", i)

    // Ponteiros também podem ser impressos.
    fmt.Println("pointer:", &i)
}

Resumo

Neste laboratório, você aprendeu como usar ponteiros em Golang. Você também aprendeu a diferença entre passar valores e ponteiros para funções.