Код:
//что выведет код?
Код:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
//что выведет код? package main import "fmt"
func main() { nums := make([]int, 1, 2) fmt.Println(nums) //
appendSlice(nums, 1024)
fmt.Println(nums) //
mutateSlice(nums, 1, 512)
fmt.Println(nums) //
}
func appendSlice(sl []int, val int) { sl = append(sl, val) }
func mutateSlice(sl []int, idx, val int) { sl[idx] = val }
Ответ
Код:
package main
import "fmt"
func main() {
a := []int{1, 2, 3, 4, 5}
b := a[:2] // b ссылается на первые два элемента a: [1, 2]
b = append(b, 100) // добавляем 100 в срез b
fmt.Println(a, b)
}
Разбор:
- Изначально
a= [1, 2, 3, 4, 5] b := a[:2]— срезbсодержит [1, 2], при этом уbемкость равна 5 (от 0 до концаa)append(b, 100)добавляет элемент 100 в срезb. Поскольку емкостьbпозволяет расшириться без выделения новой памяти, элемент 100 записывается вa[2], то есть изменяет исходный массивa.
После append:
aстановится [1, 2, 100, 4, 5]bстановится [1, 2, 100]
Вывод:
[1 2 100 4 5] [1 2 100]
То есть изменился элемент a[2] из 3 в 100, так как b и a разделяют один underlying array.