为了账号安全,请及时绑定邮箱和手机立即绑定

具体类型与返回类型上的接口不匹配

具体类型与返回类型上的接口不匹配

Go
吃鸡游戏 2023-05-15 14:43:41
我正在玩 Go,发现了一个我无法解决的问题。假设我有这样的代码:// Imagine this is an external package for querying MySQL: I run a query // and it gives me back a struct with a method "Result" to get the result// as a string// I can NOT modify this code, since it is an external packagepackage bartype MySQL struct {}func (m *MySQL) RunQuery() *MySQLResult {    return &MySQLResult{}}type MySQLResult struct {}func (r *MySQLResult) Result() string {    return "foo"}我导入了包并开始使用它:// I created a little runner to help mefunc run(m *bar.MySQL) string {    return m.RunQuery().Result()}func main() {    m := &bar.MySQL{}    fmt.Println(run(m)) // Prints "foo"}我真的很喜欢我的助手“运行”,但我想让它更慷慨:我不希望人们总是给我一个 MySQL 客户端。它可以是任何具有“RunQuery”和“Result”方法的东西。所以我尝试使用接口:type AnyDB interface {    RunQuery() interface{ Result() string }}func run(m AnyDB) string {    return m.RunQuery().Result()}可悲的是,这不再编译了。我收到此错误:cannot use m (type *MySQL) as type AnyDB in argument to run:    *MySQL does not implement AnyDB (wrong type for RunQuery method)        have RunQuery() *MySQLResult        want RunQuery() interface { Result() string }这是 Go 不支持的,还是我做错了什么?
查看完整描述

1 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

RunQuery应该返回接口,否则你总是要处理强类型。


AnyDB不是必需的,我添加它是为了方便。


AnyResult应该在bar包中定义或导入其中。


type AnyDB interface {

    RunQuery() AnyResult

}


type MySQL struct{}


func (m *MySQL) RunQuery() AnyResult {

    return &MySQLResult{}

}


type AnyResult interface {

    Result() string

}


type MySQLResult struct{}


func (r *MySQLResult) Result() string {

    return "foo"

}


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信