У меня странная ошибка в Голанге.
OS: Linux Ubuntu 18.04.
CPU: AMD with 64 Bit Support.
IDE is Goland 2018.1.5.
Go version is 1.10.1.
Compiler is set to: 'Any'.
Я пробовал оба компилятора "gc" и "gccgo". Результат тот же.
В приведенной ниже программе Debugger показывает странные вещи. Переменная 'aUnion' содержит внутри «John», но переменная «aRecord», в которой есть тип Union, не имеет внутри «John».
Если я 'fmt.Printf', они оба там, но отладчик не показывает Джона внутри 'aRecord'. Это ошибка отладчика?
Программа очень простая. Просто вложенные структуры передаются как указатель.
// 33.go.
package main
import "fmt"
type Person struct {
Name string
Age int
}
type GroupOfPeople struct {
Name string
People []*Person
}
type Union struct {
ID int
Group *GroupOfPeople
}
type Record struct {
UnionField *Union
Type int
}
func main() {
var aPerson *Person
var people []*Person
var aGroup *GroupOfPeople
var aUnion *Union
var aRecord *Record
aPerson = &Person{
Name: "John",
Age: 10,
}
people = []*Person{aPerson}
aGroup = &GroupOfPeople{
Name: "A Group",
People: people,
}
aUnion = &Union{
ID: 123,
Group: aGroup,
} // John is inside 'aUnion'.
aRecord = &Record{
UnionField: aUnion,
Type: 666,
}
// John is NOT inside 'aRecord'.
// WHY ?!
fmt.Printf("aUnion: %+v.\r\n", aUnion.Group.People[0])
fmt.Printf("aRecord: %+v.\r\n", aRecord.UnionField.Group.People[0])
}
Спасибо за помощь!
Я отредактировал вопрос. fmt.Printf показывает Джона в обеих структурах. Основная проблема в том, что встроенный отладчик Goland не показывает Джона внутри 'aRecord'. Интересно, почему это так и как это исправить.
попробуйте проверить их в отладчике. вы будете удивлены ...
Вопросы, требующие помощи по отладке («почему этот код не работает?»), Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для их воспроизведения в самом вопросе. Вопросы без четкой постановки проблемы не будут полезны другим читателям. См .: Как создать минимальный, полный и проверяемый пример.
Вот MCVE, который дает ожидаемый результат: play.golang.org/p/O_TkFDcunUU Пожалуйста, предоставьте точные, подробные инструкции о том, как воспроизвести вашу проблему.
На сайте play.golang.org нет отладчика. Для воспроизведения проблемы вы можете отладить код в программе Goland указанной версии. Установите точку останова на последней строке кода и проверьте две упомянутые мной переменные. Вы понимаете, что я вам говорю?
Вот свидетельство странного поведения отладчика. 2 изображения. Почувствуйте разницу. 1. imghost.io/image/fGdA8 2. imghost.io/image/fGcjX Теперь вы поняли?





Это проблема в том, как GoLand обрабатывает вложение значений этих переменных во время выполнения.
Я создал Эта проблема, чтобы отслеживать и исправлять.
Между тем, вы можете использовать функцию «Наблюдения», чтобы наблюдать за «aRecord.UnionField.Group.People» в качестве примера, который затем будет правильно отображать значения. Извините за причиненные неудобства.
И небольшое обновление. Это будет исправлено в выпуске 2018.2, и если вы хотите попробовать его раньше, вы можете использовать следующий выпуск EAP после 2018.2 EAP 3.
Я только что попробовал, и в обеих выходных строках есть «Джон». Что произойдет, если вы скомпилируете и запустите эту программу из командной строки (
go run file.go)?