0Pricing
Go Academy · Урок

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

Оператор взятия адреса, разыменование и нулевые указатели

«Что такое указатели» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Что такое указатели
  2. Указатели и функции
  3. Получатели-указатели в методах
  4. new() и когда использовать указатели
← Назад к Go Academy