Go - указатели

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

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

package main

import "fmt"

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

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

Address of a variable: 10328000

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

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

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

var var_name *var-type

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

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

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

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

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

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

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

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

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

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 (ноль), предполагается, что он ни на что не указывает.

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

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

Подробнее о указателях Go

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

Старший Нет Концепция и описание
1 Go - массив указателей

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

2 Перейти - указатель на указатель

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

3 Передача указателей на функции в Go

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