Параметр-срез в Go
Давайте теперь будем передавать в функцию срез и обходить его внутри.
В параметре указывают тип с квадратными скобками без числа, например
[]int. В теле доступны индекс, len и цикл по элементам.
Изменим первый элемент среза внутри функции func:
package main
import "fmt"
func func(nums []int, v int) {
nums[0] = v
}
func main() {
data := []int{1, 2, 3}
func(data, 9)
fmt.Println(data) // выведет [9 2 3]
}
После вызова в data первый элемент равен 9.
Параметр-срез копирует заголовок, но делит массив элементов, поэтому
запись по индексу видна снаружи.
Сумму элементов удобно считать в отдельной функции sum с тем же
типом параметра:
package main
import "fmt"
func sum(nums []int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
func main() {
vals := []int{2, 3, 5}
fmt.Println(sum(vals)) // выведет 10
}
Срез в параметр передают переменной, а не списком в фигурных скобках языка с другими правилами. Длина в тип не входит: одна и та же функция примет срез из двух элементов и срез из десяти.
Дан следующий срез:
nums := []int{4, 1, 7}
Напишите функцию func с параметром-срезом, которая возвращает
элемент с индексом 0. Выведите результат для nums.
Дан следующий срез:
data := []int{2, 2, 2}
Напишите функцию func, которая прибавляет 10 к
элементу с индексом 0. Вызовите с data и выведите срез
после вызова.
Скажите, изменится ли исходный срез снаружи, если внутри функции
записать новое значение по индексу 0.