Slice продолжает заполнять старые записи в цикле - PullRequest
0 голосов
/ 05 июля 2019

Я наблюдаю странное явление во время зацикливания очереди, реализованной на срезе, и никогда раньше не испытывал ее:

fmt.Printf("BEFORE LOOP\n")

for len(queue) > 0 {
    fmt.Printf("BEFORE-QUEUE=(%d) %v\n", len(queue), queue)
    currentPath, queue := queue[0], queue[1:]
    fmt.Printf("PATH=[%s] AFTER-QUEUE=(%d) %v\n", currentPath, len(queue), queue)
}

fmt.Printf("AFTER LOOP\n")

Вывод:

BEFORE LOOP
BEFORE-QUEUE=(1) [../../test/asset]
PATH=[../../test/asset] AFTER-QUEUE=(0) []
BEFORE-QUEUE=(1) [../../test/asset]
PATH=[../../test/asset] AFTER-QUEUE=(0) []
BEFORE-QUEUE=(1) [../../test/asset]
PATH=[../../test/asset] AFTER-QUEUE=(0) []
BEFORE-QUEUE=(1) [../../test/asset]
PATH=[../../test/asset] AFTER-QUEUE=(0) []
BEFORE-QUEUE=(1) [../../test/asset]
...

Этоработает через "Go Run" под версией 1.11.4.Я не уверен, что в моей ситуации / дизайне вызвало такое поведение.

Мысли / Анализы?

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Вы создаете новую переменную очереди (из-за: =). Попробуйте:

currentPath := queue[0]
queue = queue[1:]
0 голосов
/ 05 июля 2019

Хорошо, так что происходит то, что мы используем назначение короткой переменной (оператор нового назначения ": ="), чтобы назначить новую переменную и обновить очередь (объединенную в многократное назначение, для удобства) , Это создает новый экземпляр очередь внутри блока, чья область имеет приоритет над областью, назначенной во внешнем блоке. Итак, в рамках текущей итерации тела цикла у нас есть временный экземпляр queue , который может быть пустым, но затем отбрасываться в конце итерации. Чтобы решить эту проблему для текущего варианта использования, предварительно определите currentPath , а затем переключитесь на использование «=» вместо «: =»:

for len(queue) > 0 {
    var currentPath string
    currentPath, queue = queue[0], queue[1:]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...