【问题标题】:Interface typecasting not working接口类型转换不起作用
【发布时间】:2018-05-31 17:24:19
【问题描述】:
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 方法?

【问题讨论】:

  • Go 是静态类型的,所以你不能更改 service 的类型,并且 go 中没有类型转换。如果你只想调用GetAccount,为什么不接受只有那个方法的接口呢?

标签: go interface glide-golang


【解决方案1】:

注释您的代码示例:

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.AccountMock_Account 或任何实现GetAccount 方法并具有适当签名的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2022-01-21
    • 1970-01-01
    • 2016-03-06
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多