Передача по значению и по указателю

Go передаёт аргументы в функции по значению: функция получает копию, а не оригинал.

func double(x int) {
    x *= 2           // изменяет только копию
}

n := 5
double(n)
fmt.Println(n)       // 5 — не изменилось

Чтобы функция могла изменить переменную вызывающего кода, передают адрес:

func double(x *int) {
    *x *= 2
}

n := 5
double(&n)
fmt.Println(n)       // 10

Срез ([]T) и карта (map[K]V) внутри содержат указатель на данные. При передаче в функцию копируется заголовок (pointer + len + cap), но данные — общие:

func fill(s []int) {
    s[0] = 99        // изменяет исходный массив
}

a := []int{1, 2, 3}
fill(a)
fmt.Println(a)       // [99 2 3]

Однако append может создать новый массив — изменения тогда не видны снаружи. Если нужно изменить сам срез (длину), передают *[]int.


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