Go в примерах: Указатели (Pointers)

Go поддерживает указатели, позволяя вам передавать ссылки на значения и записи в вашей программе.

package main
import "fmt"

Мы покажем, как работают указатели, на примере 2 функций: zeroval и zeroptr. В zeroval определен только 1 аргумент с типом int, который передается по значению. zeroval получает копию ival при вызове функции.

func zeroval(ival int) {
    ival = 0
}

zeroptr получает в качестве аргумента параметр *int, который является указателем на int. Запись *iptr в теле функции разыменовывает указатель с его адреса памяти на текущее значение по этому адресу. Присвоение значения разыменованному указателю изменяет значение по указанному адресу.

func zeroptr(iptr *int) {
    *iptr = 0
}
func main() {
    i := 1
    fmt.Println("initial:", i)
    zeroval(i)
    fmt.Println("zeroval:", i)

Запись &i получается ссылку на область памяти, в которой хранится i, т.е. указатель на i.

    zeroptr(&i)
    fmt.Println("zeroptr:", i)

Указатели могут быть выведены на экран

    fmt.Println("pointer:", &i)
}

zeroval не изменяет значение i в main, но zeroptr изменяет, т.к. в него передается указатель на область памяти, в которой хранится переменная.

$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100

Следующий пример: Структуры (Structs).