1

パッケージのドキュメントを確認しましたreflectが、何も見つかりませんでした。私がやろうとしているのは、インターフェースxを実装するすべての構造体を見つけることです。次に、すべての構造体を繰り返し処理して、アクションyを実行します。

4

2 に答える 2

3

このようなインターフェイスで型アサーションを使用します (プレイグラウンド リンク)。いくつかのstructインスタンスを念頭に置いていると思います (おそらく、[]interface{}以下の例のように)。

package main

import "fmt"

type Zapper interface {
    Zap()
}

type A struct {
}

type B struct {
}

func (b B) Zap() {
    fmt.Println("Zap from B")
}

type C struct {
}

func (c C) Zap() {
    fmt.Println("Zap from C")
}

func main() {
    a := A{}
    b := B{}
    c := C{}
    items := []interface{}{a, b, c}
    for _, item := range items {
        if zapper, ok := item.(Zapper); ok {
            fmt.Println("Found Zapper")
            zapper.Zap()
        }
    }
}

オンザフライでインターフェイスを定義し、item.(interface { Zap() })それが 1 回限りでそのスタイルが気に入った場合は代わりにループで使用することもできます。

于 2013-03-10T11:18:58.860 に答える
2

これは実行時に実行することはできませんが、プログラムパッケージ(およびすべてのインポートを再帰的に検査すること)を静的に検査することによってのみ実行できます。または、生成された。{o、a}ファイルを静的に検査します。

ただし、インターフェイスを満たすタイプのリスト(構造体だけに限定されない、なぜですか?)を手動で作成することもできます。

if _, ok := concreteInstance.(concreteInterface); ok {
        // concreteInstance satisfies concreteInterface
}
于 2013-03-10T10:08:41.273 に答える