3 回答
TA贡献1866条经验 获得超5个赞
你实际上不能。接口只定义一个类型可用的方法集,它们不公开字段。在您的情况下,我建议您进行类型切换。它看起来有点像这样;
switch v := myInstance.(type) {
case CEvent:
fmt.Println(v)
case CommonEvent:
fmt.Println(v)
case WindowEvent:
fmt.Println(v)
default:
fmt.Println("unknown")
}
您可能希望根据您在此之后对实例执行的操作以稍微不同的方式构建您的代码,但这为您提供了基本思想。您还可以使用单个类型进行类型断言,例如;v, err := myInstance.(CommonEvent)但我怀疑它在这里是否有效。如果类型myInstance不是CommonEvent,它也会返回错误,因此这并不是确定可能是什么类型和接口实例的最佳方法。
TA贡献1826条经验 获得超6个赞
您将需要知道类型。假设我们知道这是一个 CEvent:
cEvent, ok := Event.(CEvent)
if !ok {
// You lied, not a CEvent
return
}
// Otherwise, you can get the type!
fmt.Println(cEvent.Type)
当然,如果你不知道类型,你可以保持类型断言,直到你正确为止。否则,抛出错误,返回默认值等:
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贡献1810条经验 获得超4个赞
您可能会花费大量时间进行反射调用或尝试猜测类型或使用类型切换。
或者,您可以定义一个接口,其中包含返回所需信息的函数。
例如你可以做
type Event interface {
GetCommonEvent() *CommonEvent
GetWindowEvent() *WindowEvent
}
- 3 回答
- 0 关注
- 189 浏览
添加回答
举报