Как использовать список с циклами for в go - PullRequest
1 голос
/ 16 октября 2019

Я хочу добавить числа в список, но мой срез обновляет значение только в цикле for.

Как обновить его снаружи?

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

for i := 0; i < len(slice); i++ {
    slice := append(slice, i)
    fmt.Println(slice)
}

fmt.Println(slice)

Фактический результат

[5 4 3 2 1 0]
[5 4 3 2 1 1]
[5 4 3 2 1 2]
[5 4 3 2 1 3]
[5 4 3 2 1 4]
[5 4 3 2 1]

Ожидаемый результат

[5 4 3 2 1 0]
[5 4 3 2 1 1]
[5 4 3 2 1 2]
[5 4 3 2 1 3]
[5 4 3 2 1 4]
[5 4 3 2 1 0 1 2 3 4]

Этот код работает на Python, но в go есть кое-что, что я не уловил

1 Ответ

1 голос
/ 16 октября 2019

Вы не сохраняете результат 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Детская площадка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...