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