cpp

Передача массивов и слайсов в функцию

Передача массива в функцию по умолчанию выполняется по значению, т. е. создается копия массива. Поэтому изменение массива внутри функции не затронет значений исходного массива. Если массив большой или нужно изменить массив внутри функции, то следует передавать указатель на массив (листинг 10.7).

Листинг 10.7. Передача массива в функцию

package main

import "fmt"

func main() {
   arr1 := [3]int{1, 2, 3}
   arr2 := [3]int{4, 5, 6}
   test1(arr1)
   fmt.Println(arr1)    // [1 2 3] значение НЕ изменилось
   test2(&arr2)         // Передаем адрес
   fmt.Println(arr2)    // [88 5 6] значение изменилось
}
func test1(a [3]int) {  // Передается копия массива
   a[0] = 88            // Не влияет на исходный массив
}
func test2(a *[3]int) { // Передается адрес массива
   a[0] = 88            // Изменяется значение массива arr2
}

Передача массива в функцию используется крайне редко, т. к. существует жесткая привязка к размеру массива. Вы же помните, что размер является неотъемлемой частью типа? Поэтому передать массив другого размера нельзя. Вместо передачи массива лучше использовать передачу слайса.

Передача слайса в функцию по умолчанию также выполняется по значению, но значением слайса является лишь структура с тремя полями, а не исходный массив. Поэтому при передаче слайса копируется лишь указатель на исходный массив. Благодаря этому мы можем изменить элементы слайса внутри функции (листинг 10.8).

Листинг 10.8. Передача слайса в функцию

package main

import "fmt"

func main() {
   arr1 := []int{1, 2, 3}
   arr2 := []int{4, 5, 6}
   test1(arr1)
   fmt.Println(arr1)       // [88 2 3] значение изменилось
   test2(&arr2)            // Передаем адрес
   fmt.Println(arr2)       // [88 5 6] значение изменилось
}
func test1(a []int) {
   a[0] = 88               // Изменяется значение слайса arr1
}
func test2(a *[]int) {
   (*a)[0] = 88            // Изменяется значение слайса arr2
}

Обратите внимание: при передаче слайса по значению мы можем изменять существующие элементы слайса. Если же мы добавляем новые элементы в слайс, то будет создана копия исходного массива и на изначальный слайс изменения не повлияют. В этом случае нужно вернуть новый слайс из функции (листинг 10.9).

Листинг 10.9. Передача слайса в функцию и возврат слайса

package main

import "fmt"

func main() {
   arr1 := []int{1, 2, 3}
   arr2 := []int{4, 5, 6}
   test1(arr1)
   fmt.Println(arr1)         // [1 2 3] значение НЕ изменилось
   arr2 = test2(arr2)
   fmt.Println(arr2)         // [4 5 6 88 88 88] значение изменилось
}
func test1(a []int) {
   a = append(a, 88, 88, 88) // Не влияет на исходный массив
}
func test2(a []int) []int {
   a = append(a, 88, 88, 88)
   return a
}

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp