Вказівники|Pointers
#
// Go дозволяє використовувати [_вказівники_](https://uk.wikipedia.org/wiki/Вказівник),
// що дає можливість передачі значень та записів в межах програми
// за посиланням в межах програми.
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: 0x42131100