Вы не сохраняете результат append()
в своем «оригинале» slice
, потому что вы используете краткое объявление переменной вместо присваивания :
slice := append(slice, i)
Краткое объявление переменной (поскольку оно находится в другом блоке, чем исходная slice
переменная) создает новую переменную (затенение внешней slice
), и внутри цикла вы печатаете эту новуюпеременная. Таким образом, результат каждого добавления виден только внутри тела цикла и теряется при завершении итерации. Вместо этого используйте присваивание:
slice = append(slice, i)
Однако, когда вы сделаете это, вы получите бесконечный цикл, потому что ваше условие цикла равно i < len(slice)
, а slice
увеличивается на каждой итерации.
Вместо этого вы должны сделать что-то вроде этого (оцените len(slice)
один раз и сохраните его):
for i, length := 0, len(slice); i < length; i++ {
slice = append(slice, i)
fmt.Println(slice)
}
И вывод будет (попробуйте на Go Playground ):
[5 4 3 2 1 0]
[5 4 3 2 1 0 1]
[5 4 3 2 1 0 1 2]
[5 4 3 2 1 0 1 2 3]
[5 4 3 2 1 0 1 2 3 4]
[5 4 3 2 1 0 1 2 3 4]
Обратите внимание, что вы бы получили тот же результат, если бы использовали for range
, потому что он оценивает срез только один раз:
for i := range slice {
slice = append(slice, i)
fmt.Println(slice)
}
Попробуйте этот на GoДетская площадка .