Указатели
В этой главе мы познакомимся с указателями, которые очень похожи на ссылки PHP
Указатели в Go очень похожи на ссылки в PHP. Указатель указывает на
область памяти, где хранится значение переменной. При работе с указателями
используются операторы *
и &
*
- используется для указания типа указателя и для обращения к данным на которые указывает указатель «разыменовывание»&
- используется для получения адреса переменной (указателя на нее)
Пример:
var x int // x имеет тип int
var xp *int // xp имеет тип указатель на int
xp = &x // & используется для получения адреса переменной x
*xp = 2 // записываем в участок памяти, на который указывает xp значение 2 (разыменовывание)
Значение по умолчанию для указателя - nil
Рассмотрим работу с указателями на примере функций. Предположим у нас есть функция, в которую передается целое.
func inc(v int) {
v = v + 1
}
x := 1
inc(x)
Значение x
в результате выполнения данного примера все еще равно 1, т.е поведение
аналогично поведению PHP. Для того, чтобы значение x
изменилось, нужно, чтобы
в функцию передавалась ссылка на целое.
func inc(v *int) {
*v = *v + 1
}
x := 1
inc(&x)
Обратите внимание на * перед указанием типа переменной в объявлении функции. Это значит, что в функцию передается указатель на переменную.
В PHP, когда в функцию передается объект, всегда передается ссылка (указатель) на объект. То есть, изменив объект внутри функции, мы изменим исходный объект. В Go всегда передается копия и если мы хотим передавать указатель, то мы должны сделать это явно. Это относится не только к любым типам, но и к структурам, с которыми мы познакомимся далее.
Задание:
Напишите функцию swap, которая принимает два указателя на целое, меняет их значения местами и возвращает указатель на целое с их суммой.