[英]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
C
有一個成員函數Get
返回一個指向struct CA
的指針,它實現了接口A
結果是Go不能從struct C
推導出接口B
,即使它們的Get
方法只在返回類型中是不同的,它是可轉換的。
我提出這個問題的原因是當接口A,B和struct 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.