go - 接口类型转换不起作用
问题描述
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 方法?
解决方案
要注释您的代码示例:
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
并传递 aservices.Account
或 aMock_Account
或任何实现GetAccount
具有适当签名的方法的类型。
推荐阅读
- data-structures - 存储自己的 Movesense 数据结构
- mysql - RR下mysql innodb engine next-key lock问题
- sql - 更新多值 postgres
- openapi - OpenApi Spring 生成器 - 缺少模型文件
- javascript - 如何使用 NodeJs 从 postgres 返回 INSERT 命令中的所有数据
- excel - VBA - 在文件夹中打开单个 .csv 文件
- html - 如何使用 Angular 在 HTML 中访问没有键名的数组对象
- amazon-web-services - CloudFront 行为
- java - Cloud Firestore 使用不必要的小数位保存数字
- angular - 当我选择单选按钮组中的所有单选按钮时,它们都会被选中?