Есть ли особенности поведения при передаче map и slice в функцию?
Ответ
Передача slice и map может заставить усомниться в том, что они передаются в функцию по значению. Однако здесь так же происходит копирование. Структуры slice и map (уточнение: в случае map копируется не сама структура, а указатель структуру hmap, подробнее о том, что такое hmap можно прочитать в первой статье) копируются, однако в самих структурах содержатся ссылки на области памяти, благодаря которым создается эффект передачи по ссылке.
Вывод
Вывод
@golang_interview
Ответ
Передача 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