我们需要意识到的第一件事是该行
var f foo等于
f := foo{}。这会将内部字段bar(* bar类型)初始化为其零值…
nil。嵌入类型和反射的行为似乎是将嵌入类型的字段视为类型本身的字段。因此,当您请求时,
v.FieldByName("S")它试图在f的成员bar中找到该字段,为nil。您正在尝试执行此操作
(*f.bar).S。(在Go语言中,不需要显式指针取消引用,但这是我的意思)。现在的问题是:如果更改,
v.FieldByName("bar")为什么会给出错误?相同的原因。仔细查看堆栈跟踪,
FieldByName行不再崩溃,崩溃的行是
fmt.Println(string(f.S))。同样,从语义上讲,您正在执行
(*f.bar).S。但是成员“
bar”为nil,因此实际上您正在进行nil指针取消引用。
您可以将更改为
var f foo来修复这两个错误
f := foo{&bar{}}。


