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

СитуацияРекомендация
Функция должна изменить переменную вызывающего кодауказатель
Структура больше ~64 байтуказатель (избегаем копирования)
Нужно выразить «нет значения» (optional)указатель (можно nil)
Маленький тип, функция только читаетзначение
Срез, карта, каналзначение (они уже содержат указатель внутри)

Метод с pointer-receiver может изменять поля структуры; с value-receiver — нет:

type Counter struct{ n int }

func (c *Counter) Inc() { c.n++ }   // изменяет оригинал
func (c Counter)  Val() int { return c.n }

Если хоть один метод объявлен с *T, все остальные методы того же типа обычно тоже делают pointer-receiver — для консистентности.

Go сам решает, выделить переменную на стеке или в куче. Явно управлять этим, как в C, не нужно. Вернуть указатель на локальную переменную — безопасно:

func newPoint(x, y float64) *Point {
    return &Point{x, y}   // компилятор перенесёт в кучу
}

ЗаданиеСложность
1Упражнение 1medium
2Упражнение 2medium