Go за Прикладом: Вказівники (Pointers)

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

package main
import "fmt"

Ми спробуємо продемонструвати роботу вказівників - порівнюючи їх з роботою значення - на прикладі двох функцій: zeroval та zeroptr. zeroval отримує аргумент типу int (ціле число), тобто аргумент буде передано функції - “за значенням”. zeroval отримує лише копію ival з якою викликали функцію.

func zeroval(ival int) {
    ival = 0
}

Функція zeroptr аргументом потребує *int - (вказівник на ціле число), тобто прийматиме лише вказівник на цей тип даних. *iptr, в тілі функції, розіменовує вказівник з його адреси до значення в цій адресі. Присвоєння значення розіменованому вказівнику - змінює значення у адресі за посиланням.

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

Адресу вказівника можна друкувати таким чином.

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

Або скориставшись дієсловом форматування - %p.

    fmt.Printf("pointer: %p\n", &i)
}

zeroval не змінює i в main, а zeroptr робить це бо має вказівник на комірку пам’яті виділену для i.

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

Наступний приклад: Структури (Structs).