Golangでの匿名インターフェースの実装 質問する

Golangでの匿名インターフェースの実装 質問する

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インターフェイスを満たします。

おすすめ記事