Указатели и оператор new

Указатели

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

Синтаксис аналогичен таковому в С/С++. Точно как и в С, присутствует 2 оператора: астериск * - так называемое разыменование указателя, и амперсанд & - взятие адреса. Проиллюстрируем это.

package main

import (
	"fmt"
)

func main() {

	var i int = 0 // переменная типа int
	var p *int // объявление указателя на int
	p = &i // p присваивается адрес i
	fmt.Println("Адрес:", p) //выведем адрес
	fmt.Println("Значение:", *p) //выведем значение (разыменование указателя)
	*p = 5 // присвоение нового значения по данному адресу
	fmt.Println("i =", i) // исходная переменная i изменилась

}
//Результат:
//Адрес: 0x40e020
//Значение: 0
//i = 5

Приведём более полезный пример - чтение пользовательского ввода:

Таким образом можно организовать взаимодействие с пользователем в консоли. К слову, при работе с SQL запросами, также используются указатели. Но об SQL мы поговорим отдельно.

Оператор new

Что в языке Go делает оператор new? Ответ лаконичен - он создаёт указатели. Опробуем его в деле.

Как видите, всё достаточно прозрачно. Но на самом деле, оператор new применяется нечасто. В практике языка Go, обычно прибегают к явному объявлению указателей. Отчего чаще поступают так или иначе - на этот вопрос у автора нет точного ответа. Так или иначе - оператор new - это полноправный инструмент, которым можно и нужно пользоваться.

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

На этом рассмотрение предмета указателей можно считать достаточно полным. Позже мы ещё встретимся с ними, изучая функции и методы, работу с SQL, сетевое программирование. Дальше - больше.

Раунд!

Last updated