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

Го поддържа указатели1. Това ви позволява да подавате препратки2 към стойности и записи във вашата програма.


  1. pointer – указател, https://bg.wikipedia.org/wiki/Указател_(програмиране) . „Указателите са просто числа, указващи мястото на дадена стойност в паметта, и това е начинът, по който Го препраща към обекти.“ – https://go.dev/blog/greenteagc .
  2. reference – препратка; препращам към, реферирам
package main
import "fmt"

Ще покажем по какво се различават указателите от стойностите с две функции: zeroval и zeroptr. zeroval приема една стойност от вида int. zeroval ще приеме копие на ival, отделна стойност от тази, която е в извикващата функция.

func zeroval(ival int) {
    ival = 0
}

zeroptr, напротив, приема като податка *int. Сиреч, указател към някаква стойност от вида int. След това, като напишем *iptr в тялото на функцията, достъпваме пряко1 стойността, чието местонахождение (адрес) в паметта съдържа указателят с име iptr. Присвоявайки нова стойност на пряко достъпената стойност *iptr, променяме направо нея, а не адреса, който иначе указателят съдържа.


  1. dereference – достъпвам пряко, получавам пряк достъп до указваната стойност
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

Следващ пример: .