我是新手,我希望在用户和提供者之间使用(非常)松散耦合的 API 制作两个包。为此,我希望利用go的隐式实现接口(interface)和隐式转换的能力。
提供者和用户都有自己定义的接口(interface)(例如,提供者返回一个提供者.A,用户接受一个用户.A)。 使用这种模式,我可以从一种类型转换为另一种类型,而不是从另一个包中导入接口(interface)。
这适用于简单的接口(interface),但一旦方法将接口(interface)作为输入,从一种类型到另一种类型的转换就变得不可能了。
为什么 go 不允许这种转换?有什么解决方法吗?
工作示例:
package main
// Provider
type A interface{
AddString(string)
}
type a struct{
b string
}
func (a *a) AddString(b string) {
a.b = b
}
func NewA() A {
return &a{nil}
}
// User
type A2 interface{
AddString(string)
}
func Main() {
var _ A2 = NewA()
}
导致问题的例子:
package main
// Provider
type A interface{
AddB(B)
}
type B interface{}
type a struct{
b B
}
func (a *a) AddB(b B) {
a.b = b
}
func NewA() A {
return &a{nil}
}
// User
type A2 interface{
AddB(B2)
}
type B2 interface{}
func Main() {
var _ A2 = NewA() // error..
}
最佳答案
Go 将类型检查作为一项功能提供,而不是错误。当您将 B 和 B2 声明为不同的类型时,编译器会尊重这种区别并区别对待它们。
一个熟悉的例子是 time.Duration
,它只是一个 int64
来计算纳秒,但是您不能混合和匹配 int64
的变量> 和 time.Duration
没有显式类型转换。 see time.Duration docs
与其尝试绕过 Go 的类型检查功能,不如尝试学习如何使用地道的 Go 来表达您的算法。
关于go - 鸭子打字 : How to implicitly convert from an interface to another interface in go,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53421702/