我正在编写一个示例程序来回答 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 上,编译器在说什么!?!?!”。
很快,为了抢占典型的答案,我知道最接近的工作语法是 thisb := &B{A{FName:"evan", LName:"mcdonnal"}}但我认为该语法在概念上与嵌入相矛盾,所以如果它是唯一的选择,我会感到失望。如果这是唯一的方法,它是 Go 编译器的短板,还是实际上存在阻止编译器解释我的非工作示例中的语法的理论限制?
缥缈止盈
相关分类