Странный Шаблон Среза В Режиме Отладки — Go и код Visual Studio

# #go #debugging #visual-studio-code #slice

Вопрос:

Так что это не имеет большого значения, потому что я получаю желаемый результат, но мне интересно, знает ли кто-нибудь, почему мой срез проходит по шаблону туда и обратно, когда я работаю с отладчиком в коде visual studio.

Вот что у меня есть:

 
                partialKey := code   id   service
                state:="CA"
                clientId := "test"

                var combo = []string{partialKey   clientId   state,
                    partialKey   clientId   util.Constants.DEFAULT_STATE
                    partialKey   util.Constants.DEFAULT_ID   state,
                    partialKey   util.Constants.DEFAULT_ID   util.Constants.DEFAULT_STATE,
                }
 

Когда я отлаживаю код и нажимаю кнопку «Перейти», он выполняет этот странный шаблон, начиная с первой строки среза (var combo =… поэтому я назову эту строку 1, а последней строкой будет строка 4).
строка 1
строка 2
строка 1
строка 2
строка 3
строка 2
строка 3
строка 4
строка 3
строка 4

затем после этого я получаю ожидаемый фрагмент из четырех элементов с правильным форматом, так что на самом деле это не проблема, но мне просто любопытно, является ли это проблемой Или это вызвано отладчиком кода Visual studio, и может ли кто-нибудь сказать мне, почему тот или иной делает это?

Комментарии:

1. Я также наблюдаю за этим, я предполагаю, что он переходит между различными выражениями, чтобы вы могли войти в некоторые из них, если хотите.

2. Возможно, это связано с ошибками в компиляторе Go (выдача неправильной или менее интуитивно понятной информации о строках). Простой способ проверить, какая информация о строке была сгенерирована, — использовать dlv из командной строки и disassemble команды.

Ответ №1:

Таково поведение отладчика delve при такого рода объявлении массива.

Происходит то, что каждый элемент в массиве должен быть создан перед вставкой в массив. Поэтому при переходе отладчик останавливается на каждом выражении.

 var combo = []string{
  partialKey   clientId   state,                                        // EXP 1
  partialKey   clientId   util.Constants.DEFAULT_STATE,                 // EXP 2
  partialKey   util.Constants.DEFAULT_ID   state,                       // EXP 3
  partialKey   util.Constants.DEFAULT_ID   util.Constants.DEFAULT_STATE,// EXP 4
}
 

Если мы извлекаем конструкцию элемента из инициализации массива, массив инициализируется за один шаг.

 item1 := partialKey   clientId   state               
item2 := partialKey   clientId   util.Constants.DEFAULT_STATE
item3 := partialKey   util.Constants.DEFAULT_ID   state        
item4 := partialKey   util.Constants.DEFAULT_ID   util.Constants.DEFAULT_STATE

var combo = []string{item1, item2, item3, item4} // This is now one expression
 

Комментарии:

1. Я не уверен, почему в первом случае отладчик поднимается на одну строку между каждым выражением. Был бы признателен любому, кто обладает такими знаниями, чтобы вмешаться, но я подозреваю, что это связано с тем, что инициализация массива немного отличается в скомпилированном коде.