3 回答

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個贊
你實(shí)際上不能。接口只定義一個類型可用的方法集,它們不公開字段。在您的情況下,我建議您進(jìn)行類型切換。它看起來有點(diǎn)像這樣;
switch v := myInstance.(type) {
case CEvent:
fmt.Println(v)
case CommonEvent:
fmt.Println(v)
case WindowEvent:
fmt.Println(v)
default:
fmt.Println("unknown")
}
您可能希望根據(jù)您在此之后對實(shí)例執(zhí)行的操作以稍微不同的方式構(gòu)建您的代碼,但這為您提供了基本思想。您還可以使用單個類型進(jìn)行類型斷言,例如;v, err := myInstance.(CommonEvent)但我懷疑它在這里是否有效。如果類型myInstance不是CommonEvent,它也會返回錯誤,因此這并不是確定可能是什么類型和接口實(shí)例的最佳方法。

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個贊
您將需要知道類型。假設(shè)我們知道這是一個 CEvent:
cEvent, ok := Event.(CEvent)
if !ok {
// You lied, not a CEvent
return
}
// Otherwise, you can get the type!
fmt.Println(cEvent.Type)
當(dāng)然,如果你不知道類型,你可以保持類型斷言,直到你正確為止。否則,拋出錯誤,返回默認(rèn)值等:
func getType(i interface{}) uint32 {
cEvent, ok := i.(CEvent)
if ok {
return cEvent.Type
}
commonEvent, ok := i.(CommonEvent)
if ok {
return commonEvent.Type
}
// Etc
return <default>
}

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個贊
您可能會花費(fèi)大量時間進(jìn)行反射調(diào)用或嘗試猜測類型或使用類型切換。
或者,您可以定義一個接口,其中包含返回所需信息的函數(shù)。
例如你可以做
type Event interface {
GetCommonEvent() *CommonEvent
GetWindowEvent() *WindowEvent
}
- 3 回答
- 0 關(guān)注
- 220 瀏覽
添加回答
舉報(bào)