私は別の構造体が埋め込まれた構造体を持っているとしましょう。私はChild
を初期化するために行くとき、私は直接ID
フィールドを初期化することはできませんGoで合成された構造体を初期化するにはどうすればよいですか?
type Base struct {
ID string
}
type Child struct {
Base
a int
b int
}
。
// unknown field 'ID' in struct literal of type Child
child := Child{ ID: id, a: a, b: b }
代わりにIDフィールドを個別に初期化する必要があります。
child := Child{ a: 23, b: 42 }
child.ID = "foo"
これはカプセル化に違反しているようです。 Childのユーザーは、IDフィールドについて異なるものがあることを知る必要があります。後で公開フィールドを埋め込み構造体に移動すると、初期化が中断される可能性があります。
は、私はすべての構造体のNewFoo()
方法を書いて、誰もがあることを願って使用していますが、が埋め込まれているフィールドのいくつかを明らかにしない埋め込まれた構造体で安全リテラル構造体を使用する方法はありますでしょうか?ここで間違ったパターンを適用していますか?
私は本当にそこにgithubの問題があるはずだと思う。私はgetter上の構文的な砂糖のように感じます([@CeriseLimónの回答](https://stackoverflow.com/questions/44123399/how-do-i-initialize-a-composed-struct-in-go/44123416? noredirect = 1#comment75266036_44123416))_really_も設定者に適用する必要があります。今やコードを醜くするだけでなく、クラスのユーザーがそれを使用するためにクラスの継承/階層に精通していることが必要です。 – KOGI