【发布时间】:2015-04-30 22:45:56
【问题描述】:
我正在编写一个示例程序来回答关于 SO 的另一个问题,但发现自己对以下代码无法编译的事实感到有些困惑;
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
是否可以在静态初始化程序中设置嵌入类型的字段值?如何?对我来说,这似乎是一个编译器错误;如果我面前没有资源并且熟悉类型,我会用头撞墙说“显然 FName 存在于 B 上,编译器在说什么!?!?!”。
很快,为了抢占典型答案,我知道最接近的工作语法是 b := &B{A{FName:"evan", LName:"mcdonnal"}},但我认为该语法在概念上与嵌入相矛盾,所以如果它是唯一的选择,我会感到失望。如果这是唯一的方法,是 Go 编译器的缺点还是实际上存在理论上的限制,会阻止编译器解释我的非工作示例中的语法?
【问题讨论】:
标签: go embedding composite-literals