Go では、匿名でインターフェースを満たす方法はありますか? どうやらないようです。しかし、これが私の最善の試みでした。
(の中に遊び場)
package main
import "fmt"
type Thing interface {
Item() float64
SetItem(float64)
}
func newThing() Thing {
item := 0.0
return struct {
Item (func() float64)
SetItem (func(float64))
}{
Item: func() float64 { return item },
SetItem: func(x float64) { item = x },
}
}
func main() {
thing := newThing()
fmt.Println("Hello, playground")
fmt.Println(thing)
}
ベストアンサー1
Goはメソッドセットどのメソッドが型に属するかを宣言します。レシーバー型 (メソッド) を持つ関数を宣言する方法は 1 つしかありません。
func (v T) methodName(...) ... { }
ネストされた関数は禁止されているため、匿名構造体にメソッド セットを定義する方法はありません。
これが許可されない 2 番目の理由は、メソッドが読み取り専用であることです。メソッド値メソッドを渡してゴルーチンで使用できるようにするために導入されましたが、メソッド セットを操作することはできません。
代わりに、ProtoThing を提供し、匿名構造体の基盤となる実装を参照することができます (プレイ中):
type ProtoThing struct {
itemMethod func() float64
setItemMethod func(float64)
}
func (t ProtoThing) Item() float64 { return t.itemMethod() }
func (t ProtoThing) SetItem(x float64) { t.setItemMethod(x) }
// ...
t := struct { ProtoThing }{}
t.itemMethod = func() float64 { return 2.0 }
t.setItemMethod = func(x float64) { item = x }
ProtoThing
これは、メソッド セットを埋め込むことによって継承されるため機能します。したがって、匿名構造体もThing
インターフェイスを満たします。