Go на примерах: Указатели

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

package main
import "fmt"

Мы покажем, как работают указатели в сравнении со значениями, на примере двух функций: zeroval и zeroptr. zeroval имеет параметр типа 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

Далее: .