Передача по значению и по указателю
По умолчанию — копия
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 | Упражнение 1 | easy |
| 2 | Упражнение 2 | easy |
| 3 | Упражнение 3 | medium |