我有一些接口,以及任意實現(xiàn)這些接口的 n 個結(jié)構(gòu)。我想保留一組類型并能夠?qū)λ鼈冞\行循環(huán)以查看實現(xiàn)了哪些類型。是否可以存儲這樣的類型?我花了一點時間使用反射包,但無法真正找到我想要的東西,我明白這是否不是最佳實踐。嘗試做類似的事情......沒有巨大的類型開關(guān),失敗,或者如果......如果......如果......type InterOne interface { InterOneMethod() string}var interfaceMap = map[string]type { "One": InterOne, ...}func doesHandle(any interface{}) []string { var handles []string for k, v := range interfaceMap { if _, ok := any.(v); ok { handles = append(handles, k) } } return handles}編輯:標(biāo)記為正確的答案在技術(shù)上是正確的。我發(fā)現(xiàn)由于有關(guān)方法調(diào)用和過度使用反射的評論,這種方法是一個壞主意。相反,我使用類型開關(guān)來檢查單個接口,因為類型開關(guān)不支持 fallthrough,而大的 if.. if.. if.. 帶有類型斷言以便能夠進(jìn)行適當(dāng)?shù)恼{(diào)用。
1 回答

嚕嚕噠
TA貢獻(xiàn)1784條經(jīng)驗 獲得超7個贊
您可以使用反射,請注意,獲取接口類型的唯一方法是使用reflect.TypeOf((*INTERFACE)(nil)).Elem(),這是一個工作示例:
var interfaceMap = map[string]reflect.Type{
"One": reflect.TypeOf((*InterOne)(nil)).Elem(),
....
}
func doesHandle(any interface{}) []string {
t := reflect.TypeOf(any)
var handles []string
for k, v := range interfaceMap {
if t.Implements(v) {
handles = append(handles, k)
}
}
return handles
}
- 1 回答
- 0 關(guān)注
- 168 瀏覽
添加回答
舉報
0/150
提交
取消