是否可以将接口的参数类型留给在 Go 中实现它的接收器?

Posted

技术标签:

【中文标题】是否可以将接口的参数类型留给在 Go 中实现它的接收器?【英文标题】:Is it possible to leave the type of the parameter of an interface to the receiver which implements it in Go? 【发布时间】:2017-11-21 03:01:40 【问题描述】:

基本上我想要一个接口,它有一个SetParams 方法,它的声明声明它接收一个参数,以及方法的返回类型,但将参数的返回类型留给接收者。

类似这样的界面:

type ParamsInterface interface 
    SetParams(<someType>) ParamsInterface

现在XStruct实现时,参数的类型是XParams

type XStruct struct 
    params XParams


func (x *XStruct) SetParams(params *XParams) ParamsInterface 
    x.params = params
    return x

但是YStruct实现的时候,参数的类型是YParams

type YStruct struct 
    params YParams


func (y *YStruct) SetParams(params *YParams) ParamsInterface 
    y.params = params
    return y

【问题讨论】:

不,这是不可能的。 【参考方案1】:

这叫做泛型,你只能使用空接口interface和 类型转换。

这是关于 go 中泛型的文档:https://docs.google.com/document/d/1vrAy9gMpMoS3uaVphB32uVXX4pi-HnNjkMEgyAHX4N4/edit#。

这也可以帮助你:

How is the empty interface different than a generic?

Why no generics in Go?

这篇文章提出了一些如何在没有泛型的情况下生活的方法:https://appliedgo.net/generics/

在这里您可以找到泛型代码生成器(老实说,这不是最好的主意)https://github.com/cheekybits/genny。

【讨论】:

但是如果我使用空界面,它不会给出来自YParamsXParams的自动完成建议吗? @AyushGupta 我更新了答案,检查最后两个链接 嗯,如果我不使用泛型,我将不得不创建一个 Stub,为 XParams 提供了一个特定的方法 @AyushGupta 不理解你 请注意,Go 中没有类型“强制转换”。你有“类型转换”和“类型断言”,两者完全不同。

以上是关于是否可以将接口的参数类型留给在 Go 中实现它的接收器?的主要内容,如果未能解决你的问题,请参考以下文章

[Go] gocron源码阅读-空接口类型interface{}

Go错误处理

是否可以在 GraphQL 中实现多个接口?

了解类型参数是不是在 c# 2.0 中实现接口的更简单方法是啥?

Go36-40,41-io包中的接口和工具

[Go]接口的运用