Есть ли особенности поведения при передаче map и slice в функцию?



Ответ

Передача slice и map может заставить усомниться в том, что они передаются в функцию по значению. Однако здесь так же происходит копирование. Структуры slice и map (уточнение: в случае map копируется не сама структура, а указатель структуру hmap, подробнее о том, что такое hmap можно прочитать в первой статье) копируются, однако в самих структурах содержатся ссылки на области памяти, благодаря которым создается эффект передачи по ссылке.



func main() {

slice := []int{1, 2, 3, 4, 5}



fmt.Println(slice)

fmt.Printf("%p\n", &slice)



changeZeroElem(slice)



fmt.Println(slice)

}



func changeZeroElem(slice []int) {

fmt.Printf("%p\n", &slice)



slice[0] = 99

}



Вывод



[1 2 3 4 5]

0xc0000ac018

0xc0000ac048

[99 2 3 4 5]




func main() {

store := map[string]int{"first": 1, "second": 2}



fmt.Println(store)

fmt.Printf("%p\n", &store)



changeMapElem(store)



fmt.Println(store)

}



func changeMapElem(store map[string]int) {

fmt.Printf("%p\n", &store)



store["first"] = 99

}



Вывод



map[first:1 second:2]

0xc0000b2018

0xc0000b2028

map[first:99 second:2]




@golang_interview