gpt4 book ai didi

go - golang中的隐式接口(interface)转换

转载 作者:IT王子 更新时间:2023-10-29 01:06:33 25 4
gpt4 key购买 nike

这是我想展示的想法的一个例子。

package main
import "fmt"

// interface declaration
//

type A interface {
AAA() string
}

type B interface{
Get() A
}

// implementation
//

type CA struct {}

// implementation of A.AAA
func (ca *CA) AAA() string {
return "it's CA"
}

type C struct {}

// implementation of B.Get, except for returning a 'struct' instead of an 'interface'
func (c *C) Get() *CA {
return &CA{}
}

func main() {
var c interface{} = &C{}
d := c.(B)
fmt.Println(d.Get().AAA())
fmt.Println("Hello, playground")
}

在这个例子中

  • interface B 有一个方法 Get 返回一个接口(interface) A
  • struct C 有一个成员函数Get 返回指向struct CA 的指针,它实现了接口(interface)A

结果是Go无法从结构C推导出接口(interface)B,甚至他们的Get方法也只是返回类型不同,这是可兑换的。

我提出这个问题的原因是当interface A,Bstruct C,CA在不同的包中时,我只能:

  • C的Get方法细化为func Get() A,引入包间的依赖。
  • 将接口(interface) BGet 方法和结构 C 都优化为 func Get() 接口(interface){}

我想避免包之间的依赖,尽量不依赖接口(interface){},谁能给我一些提示? Go 的最佳实践是什么?

最佳答案

您当前的 *C 类型没有实现接口(interface) B,因此您不能分配 *C 的值 到类型 B 的变量,你也不能从持有类型 *C< 的值的东西中“键入断言” B 的值.

这是您可以执行的操作。由于您已经在使用结构文字 (&C{}),因此您可以将 c 声明为 *C 类型,您可以调用它的Get()方法,可以将C.Get()的返回值转换为A(因为返回值确实实现了A):

var c *C = &C{}
var a A = c.Get() // This is ok, implicit interface value creation (of type A)
fmt.Println(a.AAA())
// Or without the intermediate "a", you can simply call:
fmt.Println(c.Get().AAA())

输出:

it's CA
it's CA

或者重构:

问题是您有一个要实现的接口(interface) (B),它有一个返回另一个接口(interface) (A) 的方法。要实现此B 接口(interface),您必须依赖于定义A 的包,您无法避免这一点。并且您必须声明 C.Get() 以返回 A(而不是具体的结构类型)。

你可以将 A 移动到第三个包,然后定义 C 的包将只需要依赖这个第三个包,而不依赖于那个包定义 B(但仍将隐式实现接口(interface)类型 B)。

关于go - golang中的隐式接口(interface)转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31694238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com