Указатели

В этой главе мы познакомимся с указателями, которые очень похожи на ссылки 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, которая принимает два указателя на целое, меняет их значения местами и возвращает указатель на целое с их суммой.

results matching ""

    No results matching ""