# #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. Я не уверен, почему в первом случае отладчик поднимается на одну строку между каждым выражением. Был бы признателен любому, кто обладает такими знаниями, чтобы вмешаться, но я подозреваю, что это связано с тем, что инициализация массива немного отличается в скомпилированном коде.