go - 鸭子打字 : How to implicitly convert from an interface to another interface in go

标签 go interface type-conversion

我是新手,我希望在用户和提供者之间使用(非常)松散耦合的 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/

相关文章:

Go编程语言代码错误

c# - 为什么我不能覆盖我的接口(interface)方法?

java - JPA 类型的搜索查询

C 的字符和字符串

c++ - 如何将0x0000之类的字符串转换为int

go - 如何使用过滤器进行websocket portforward或在golang中保存(以数组形式)转发的数据包?

语言 : lack of contains method design-justification

go - Golang 中处理多个错误的最佳实践

c++ - 关于 C++ 中接口(interface)类的使用

java - 为什么有些 API 只提供接口(interface),而不是类?