func GetResult (service interface{}) {
switch v := service.(type) {
case services.Account:
service = service.(services.Account)
default:
service = service.(Mock_Account)
}
res, err := service.GetAccount()
}
它说服务是接口的类型没有任何方法。有类型转换不起作用任何想法如何调用GetAccount方法?
答案 0 :(得分:3)
注释您的代码示例:
func GetResult (service interface{}) {
// service is of type interface{}
switch v := service.(type) {
case services.Account:
// This does nothing: it assigns the existing value back into service, which is still of type interface{}
// v exists in scope and is of type services.Account, but it's unused.
service = service.(services.Account)
default:
// Ditto
service = service.(Mock_Account)
}
// service is still of type interface{}, which defines no methods
res, err := service.GetAccount()
}
如您所见,此处的变量service
始终类型为interface{}
。变量的类型无法更改:Go是静态类型。但是,如果您只想在传入的任何类型上调用方法GetAccount
,则可以通过声明接口来完成此类型断言和完全类型安全:
type AccountGetter interface {
GetAccount() (res ResultType, err error)
}
func GetResult(service AccountGetter) {
res,err := service.GetAccount()
}
然后,您可以拨打GetResult
并传递services.Account
或Mock_Account
或任何使用相应签名实现GetAccount
方法的类型。