Го поддържа указатели1. Това ви позволява да подавате препратки2 към стойности и записи във вашата програма.
import "fmt"
Ще покажем по какво се различават указателите от
стойностите с две функции: zeroval и zeroptr.
zeroval приема една стойност от вида int. zeroval
ще приеме копие на ival, отделна стойност от тази,
която е в извикващата функция.
func zeroval(ival int) {
ival = 0
}
zeroptr, напротив, приема като податка *int. Сиреч,
указател към някаква стойност от вида int. След това,
като напишем *iptr в тялото на функцията, достъпваме
пряко1 стойността, чието
местонахождение (адрес) в паметта съдържа указателят с
име iptr. Присвоявайки нова стойност на пряко
достъпената стойност *iptr, променяме направо нея, а
не адреса, който иначе указателят съдържа.
func zeroptr(iptr *int) {
*iptr = 0
}
func main() {
i := 1
fmt.Println("начална стойност на i:", i)
zeroval(i)
fmt.Println("zeroval:", i)
Като напишем &i, получваме адреса на i в паметта, сиреч, указателя към i.
zeroptr(&i)
fmt.Println("zeroptr:", i)
Указателите също могат да бъдат отпечатвани.
fmt.Println("указател към i – &i:", &i)
Нов указател към стойност може да бъде създаден с вградената функция new.
p := new(42)
fmt.Println("стойност, указана от *p:", *p)
zeroptr(p)
fmt.Println("стойност, указана от *p:", *p)
}
zeroval не променя зададената стойност на i в main, но zeroptr я
променя защото получава препратка към местонахождението на стойността на тази
променлива.
$ go run pointers.go
начална стойност на i: 1
zeroval: 1
zeroptr: 0
указател към i – &i: 0x1631184180d8
стойност, указана от *p: 42
стойност, указана от *p: 0
Следващ пример: Низове и Руни.