我正在研究一个示例程序来回答这里的另一个问题,并发现自己有些困惑,因为下面的代码不会编译;复合文字和嵌入式字段
https://play.golang.org/p/wxBGcgfs1o
package main
import "fmt"
type A struct {
FName string
LName string
}
type B struct {
A
}
func (a *A) Print() {
fmt.Println(a.GetName())
}
func (a *A) GetName() string {
return a.FName
}
func (b *B) GetName() string {
return b.LName
}
func main() {
a := &A{FName:"evan", LName:"mcdonnal"}
b := &B{FName:"evan", LName:"mcdonnal"}
a.Print()
b.Print()
}
的错误是;
/tmp/sandbox596198095/main.go:28: unknown B field 'FName' in struct literal
/tmp/sandbox596198095/main.go:28: unknown B field 'LName' in struct literal
是否可以在静态初始化程序中设置嵌入类型的字段值?怎么样?对我来说,这似乎是一个编译器错误;如果我没有在我面前的来源,并熟悉类型我会打我的头撞墙说:“明确F名存在B编译器说什么!?!?!”。
快速,以抢占典型的答案我知道最接近的工作语法是这个b := &B{A{FName:"evan", LName:"mcdonnal"}}
,但是在我看来,这种语法在概念上与嵌入相矛盾,所以如果它是唯一的选择,我会感到失望。如果这是唯一的方法,它是Go编译器的一个简短的介绍,还是实际上存在一个理论上的限制,它会阻止编译器解释我的非工作示例中的语法?
可能重复[获取错误:结构体文字中的未知字段](https://stackoverflow.com/questions/33098460/getting-error-unknown-field-in-struct-literal) –