2013-03-10 71 views
1

我檢查了reflect軟件包的文檔,但沒有找到任何東西。我想要做的是找到所有結構,實現接口x。然後迭代所有的結構來執行一個動作y。是否可以接收實現某個接口的所有結構?

+0

我懷疑這是可能的。根據我所瞭解的有關接口的實現,該信息不會在運行時保存。 – fuz 2013-03-10 14:14:35

回答

2

這不能在運行時完成,但只能靜態地通過檢查程序包(以及遞歸的所有導入)來完成。或者通過靜態檢查生成的{o,a}文件。

然而,一個可以手動生成的類型滿足的接口列表(不僅限於結構,爲什麼?):

if _, ok := concreteInstance.(concreteInterface); ok { 
     // concreteInstance satisfies concreteInterface 
} 
3

使用類型斷言,像這樣的接口(playground link)。我假設你有一些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() 
     } 
    } 
} 

define the interface on the fly,並且可以使用item.(interface { Zap() })的循環,而不是它是否是一次性的,你喜歡這種樣式。

相關問題