Это происходит потому, что срез val
содержит указатели на свои сублим, а не сами субликсы.В своем коде вы изначально размещаете указатель на values
в позициях val[0]
.Затем вы изменяете values
и затем устанавливаете указатель на values
в val[1]
.Но и val[0]
, и val[1]
указывают на один и тот же базовый объект (values
), который был изменен.
Это можно исправить, создав новый срез values
на каждой итерации внешнегоцикл, таким образом, каждый вложенный срез val
будет различным срезом.
Например:
func main() {
val := make([][]int, 2)
for i:=0; i<2; i++ {
values := make([]int, 0, 100)
for j:=0; j<2; j++ {
values = append(values, i+j)
}
val[i] = values
fmt.Println(values, val) //
}
fmt.Println(val)
}
Вывод из fmt.Println
:
[0 1] [[0 1] []] // values, val
[1 2] [[0 1] [1 2]] // values, val
[[0 1] [1 2]] // val