簡體   English   中英

golang中的隱式接口轉換

[英]Implicit interface conversion in 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
  • struct C有一個成員函數Get返回一個指向struct CA的指針,它實現了接口A

結果是Go不能從struct C推導出接口B ,即使它們的Get方法只在返回類型中是不同的,它是可轉換的。

我提出這個問題的原因是當接口A,Bstruct C,CA在不同的包中時,我只能:

  • C的Get方法細化為func Get()A ,它引入了包之間的一些依賴關系。
  • 將接口B和結構C Get方法細化為func Get()接口{}

我想避免包之間的依賴,盡量不依賴於接口{} ,任何人都可以給我一些提示嗎? Go的最佳做法是什么?

您當前的*C類型實現接口B ,所以你不能的賦值*C到類型的變量B也不能沒有你“式的斷言”的值, B從一些持有型的價值*C

這是你可以做的。 由於您已經在使用struct literal( &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

或重構:

問題是你有一個你想要實現的接口( B ),它有一個返回另一個接口( A )的方法。 要實現此B接口,您必須依賴於定義A的包,您無法避免這種情況。 並且您必須聲明C.Get()以返回A (而不是具體的結構類型)。

您可以將A移動到第3個包,然后定義C的包只需依賴於第3個包,但不依賴於定義B的包(但仍會隱式實現接口類型B )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM