私はハンドラを受け入れる型を実装し、必要なときに呼び出す型を実装するライブラリを使っています。私は型を埋め込んだスーパータイプを作成したいのですが、埋め込み型以外のプロパティを持っています。 そして、これらのプロパティをハンドラで使用できるようにしたいと思います。ハンドラ関数があるときに型を埋め込む方法は?
引数として自分の型を使用すると、型チェックに失敗します。ハンドラdeclの基本型を使用しても、新しいフィールドにアクセスすることはできません。私は(DECLハンドラインタフェースの代わりに?)行くのは新しいです、&がこれを行う方法を知ってみたい、または有効にするには、ライブラリを変更するに示唆するのか...
不自然な例:
package main
type Animal struct {
Color string
feeders map[string]feeder
}
type feeder func(*Animal, string) string
func (a *Animal) addFeeder(name string, fn feeder) {
a.feeders[name] = fn
}
type mamal struct {
Animal
hair string
}
func feedHuman(m *mamal, food string) string {
return "you got " + m.Color + " " + m.hair + " hair in your " + food
}
func main() {
a := mamal{Animal{Color: "red"}, "bushy"}
a.addFeeder("man", feedHuman)
// fails to compile feedHuman needs to take *Animal but then cant access hair"
}
私は#2がアイデアと一致しないことに同意します。 #1は約束しているが、ライブラリの他のすべてのユーザーを壊す。だから、私はインターフェイス{}を持つ新しいジェネリックハンドラアダーを提案し、それを呼び出すために現在のものを変更します。だから、ベースフォームは一般的ですが、外部インターフェイスは、タイプを拡張しない人のために同じままです。 https://play.golang.org/p/QIZ90CiHFu – Blaize
喜んで助けました。あなたの新しいソリューションがあなたのニーズに合っていれば、それは問題ありません。 –