Я работал над образцом программы, чтобы ответить на другой вопрос здесь, на 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 или есть теоретическое ограничение, которое помешало бы компилятору интерпретировать синтаксис в моем нерабочем примере?
Возможный дубликат [Получение ошибки: неизвестное поле в строковом литерале] (https://stackoverflow.com/questions/33098460/getting-error-unknown-field-in-struct-literal) –