我有一些接口,以及任意實現這些接口的 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}編輯:標記為正確的答案在技術上是正確的。我發現由于有關方法調用和過度使用反射的評論,這種方法是一個壞主意。相反,我使用類型開關來檢查單個接口,因為類型開關不支持 fallthrough,而大的 if.. if.. if.. 帶有類型斷言以便能夠進行適當的調用。
1 回答

嚕嚕噠
TA貢獻1784條經驗 獲得超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 關注
- 174 瀏覽
添加回答
舉報
0/150
提交
取消