Учебники

Go — указатели

Указатели на Go легко и весело выучить. Некоторые задачи программирования Go выполняются проще с помощью указателей, а другие задачи, такие как вызов по ссылке, не могут быть выполнены без использования указателей. Поэтому становится необходимым изучать указатели, чтобы стать идеальным программистом на Go.

Как вы знаете, каждая переменная является ячейкой памяти, и каждая ячейка памяти имеет свой адрес, к которому можно обратиться, используя оператор амперсанда (&), который обозначает адрес в памяти. Рассмотрим следующий пример, который выведет адрес определенных переменных:

Live Demo

package main

import "fmt"

func main() {
   var a int = 10   
   fmt.Printf("Address of a variable: %x\n", &a  )
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Address of a variable: 10328000

Итак, вы поняли, что такое адрес памяти и как к нему обращаться. Теперь давайте посмотрим, что такое указатели.

Что такое указатели?

Указатель — это переменная, значением которой является адрес другой переменной, т. Е. Прямой адрес ячейки памяти. Как и любая переменная или константа, вы должны объявить указатель, прежде чем использовать его для хранения любого адреса переменной. Общая форма объявления переменной указателя —

var var_name *var-type

Здесь тип — это базовый тип указателя; это должен быть допустимый тип данных C, а var-name — это имя переменной-указателя. Звездочка *, которую вы использовали для объявления указателя, та же, что и для умножения. Однако в этом утверждении звездочка используется для обозначения переменной в качестве указателя. Следующее является действительным объявлением указателя —

var ip *int        /* pointer to an integer */
var fp *float32    /* pointer to a float */

Фактический тип данных значения всех указателей, будь то целое число, число с плавающей запятой или другое, является одним и тем же, длинное шестнадцатеричное число, представляющее адрес памяти. Единственное различие между указателями разных типов данных — это тип данных переменной или константы, на которую указывает указатель.

Как использовать указатели?

Есть несколько важных операций, которые мы часто выполняем с указателями: (а) мы определяем переменные указателя, (б) назначаем адрес переменной указателю и (в) получаем доступ к значению по адресу, хранящемуся в переменной указателя ,

Все эти операции выполняются с использованием унарного оператора *, который возвращает значение переменной, расположенной по адресу, указанному ее операндом. В следующем примере показано, как выполнить эти операции.

Live Demo

package main

import "fmt"

func main() {
   var a int = 20   /* actual variable declaration */
   var ip *int      /* pointer variable declaration */

   ip = &a  /* store address of a in pointer variable*/

   fmt.Printf("Address of a variable: %x\n", &a  )

   /* address stored in pointer variable */
   fmt.Printf("Address stored in ip variable: %x\n", ip )

   /* access the value using the pointer */
   fmt.Printf("Value of *ip variable: %d\n", *ip )
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20

Ноль указателей в го

Go компилятор присваивает значение Nil переменной указателя в случае, если у вас нет точного адреса для назначения. Это делается во время объявления переменной. Указатель, которому назначен nil, называется указателем nil .

Указатель nil — это константа со значением ноль, определенная в нескольких стандартных библиотеках. Рассмотрим следующую программу —

Live Demo

package main

import "fmt"

func main() {
   var  ptr *int

   fmt.Printf("The value of ptr is : %x\n", ptr  )
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

The value of ptr is 0

В большинстве операционных систем программам не разрешен доступ к памяти по адресу 0, поскольку эта память зарезервирована операционной системой. Однако адрес памяти 0 имеет особое значение; он сигнализирует о том, что указатель не предназначен для указания на доступную ячейку памяти. Но по соглашению, если указатель содержит значение nil (ноль), предполагается, что он ничего не указывает.

Чтобы проверить нулевой указатель, вы можете использовать оператор if следующим образом:

if(ptr != nil)     /* succeeds if p is not nil */
if(ptr == nil)    /* succeeds if p is null */

Перейти указатели в деталях

У указателей есть много, но простых концепций, и они очень важны для программирования на Go. Следующие понятия указателей должны быть понятны программисту на Go —

Вы можете определить массивы для хранения нескольких указателей.

Go позволяет вам иметь указатель на указатель и так далее.

Передача аргумента по ссылке или по адресу позволяет включить переданный аргумент в вызывающей функции вызываемой функцией.