Что такое указатели
Оператор взятия адреса, разыменование и нулевые указатели
«Что такое указатели» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Адреса памяти
Каждая переменная хранится по адресу памяти. Указатель хранит этот адрес. В Go указатели типизированы: *int хранит адрес значения типа int.
Оператор получения адреса &
Используйте &, чтобы получить адрес переменной:
package main
import "fmt"
func main() {
x := 42
p := &x
fmt.Println(p) // 0xc000... (address)
fmt.Println(*p) // 42 (value at address)
}Разыменование *
Используйте *, чтобы прочитать значение по адресу указателя или записать его:
package main
import "fmt"
func main() {
n := 10
p := &n
*p = 99
fmt.Println(n) // 99
}Указатели nil
Нулевое значение указателя — nil. Разыменование указателя nil вызывает панику:
package main
import "fmt"
func main() {
var p *int
fmt.Println(p) // <nil>
fmt.Println(p == nil) // true
// *p = 1 — PANIC
}Типы указателей
Каждый тип указателя определяется типом объекта, на который он указывает:
package main
import "fmt"
func main() {
i := 1
s := "hello"
pi := &i // *int
ps := &s // *string
fmt.Printf("%T %T\n", pi, ps) // *int *string
}Проверка на nil перед использованием
Всегда проверяйте значение на nil перед разыменованием указателя, полученного извне вашего кода:
package main
import "fmt"
func printInt(p *int) {
if p == nil {
fmt.Println("nil pointer")
return
}
fmt.Println(*p)
}
func main() {
v := 7
printInt(&v)
printInt(nil)
}Указатели на структуры
Доступ к полям структуры через указатель использует ту же точечную нотацию — Go автоматически разыменовывает указатель:
package main
import "fmt"
type Point struct{ X, Y int }
func main() {
p := &Point{1, 2}
p.X = 10 // same as (*p).X = 10
fmt.Println(*p) // {10 2}
}Сравнение указателей
Два указателя равны, если они указывают на одну и ту же переменную (один и тот же адрес) или оба имеют значение nil:
package main
import "fmt"
func main() {
a := 1
p1 := &a
p2 := &a
p3 := new(int)
*p3 = 1
fmt.Println(p1 == p2) // true — same address
fmt.Println(p1 == p3) // false — different address
}Стек и куча
Компилятор Go решает, будет ли переменная находиться в стеке или куче, с помощью анализа выхода. Когда вы берёте адрес локальной переменной и возвращаете его, Go автоматически перемещает её в кучу — вручную управлять этим не нужно.
Когда NOT следует использовать указатели
Указатель нужен не всегда:
- Небольшие типы-значения (целые числа, логические значения, небольшие структуры) дешевле копировать, чем разыменовывать
- Неизменяемые данные, общие для горутин, безопасно использовать как значение
- Используйте указатели в основном для изменения данных или больших структур
Быстрая проверка
Что возвращает оператор &?
Повторение: указатели
Основные выводы:
&vполучает адрес;*pразыменовывает указатель- Нулевое значение — nil, поэтому всегда проверяйте его перед разыменованием
- Go автоматически разыменовывает указатели при доступе к полям структур
- Анализ выхода автоматически управляет размещением в стеке и куче
Задание для практики
Напишите функцию swap(a, b *int), которая меняет местами значения двух целых чисел с помощью указателей. Вызовите её из main и выведите значения до и после.
Часто задаваемые вопросы
Урок «Что такое указатели» бесплатный?
Да — полный текст урока «Что такое указатели» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Что такое указатели»?
Оператор взятия адреса, разыменование и нулевые указатели Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Что такое указатели»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое указатели
- Указатели и функции
- Получатели-указатели в методах
- new() и когда использовать указатели