猿问

golang中的隐式接口转换

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


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")

}

在这个例子中

  • 接口B有一个Get返回接口的方法A

  • structC有一个成员函数Get返回一个指向 struct 的指针CA,它实现了接口A

结果是 Go 无法B从 struct推导出接口C,即使它们的Get方法只是返回类型不同,这是可转换的。

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

  • 将 Get 方法细化Cfunc Get() A,这会在包之间引入一些依赖关系。

  • GetinterfaceB和 struct 的方法都细化Cfunc Get() interface{}

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


米琪卡哇伊
浏览 226回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答