2 回答
TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
您永遠(yuǎn)無法將一種具體類型轉(zhuǎn)換為另一種具體類型。它們不一樣。在 Go 中無法定義這種類型的自動轉(zhuǎn)換。充其量,您可以定義一個(gè)函數(shù),該函數(shù)接受 aBar并構(gòu)建并返回一個(gè)新Foo的,其字段設(shè)置為與輸入相同的值Bar。
我讀過的所有內(nèi)容都告訴我,如果底層類型相同,則高階類型被認(rèn)為是兼容的,類型轉(zhuǎn)換會隱式發(fā)生
目前還不清楚你的來源是什么,但沒有任何東西會說明或暗示這一點(diǎn),這根本不是真的。Go 不進(jìn)行任何隱式轉(zhuǎn)換。這是 Go 的一個(gè)大聲宣傳的功能。鑒于type Foo struct { a int }and type Bar struct { a int },您永遠(yuǎn)不能將類型的對象分配給類型Bar的變量Foo。
當(dāng)類型滿足接口時(shí),您可以從任一具體類型轉(zhuǎn)換為接口類型。您的AcceptBarOrFoo方法應(yīng)該接受接口類型(兩者都Foo滿足Bar),而不是具體類型。鑒于接口只定義方法(不是成員),并且既沒有方法Foo也Bar沒有任何方法,您的接口將是空接口,interface{}. 傳入的值沒有任何用處,除非您稍后將其轉(zhuǎn)換回具體類型以訪問其成員,但這并不是接口的真正用途。
TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊
Foox與 Bar 不同,x因?yàn)榉菍?dǎo)出標(biāo)識符在包邊界之間永遠(yuǎn)不相等。通過導(dǎo)出foo.Foo 和 bar.Bar 中的字段來修復(fù):
type Foo struct {
iface.FooI
X string // <-- start with capital letter to export
}
要使用 foo.Foo 或 bar.Bar 作為參數(shù)值,foo.Foo 和 bar.Bar 必須可分配給參數(shù)的類型。使用 foo.Foo 作為參數(shù)類型是行不通的,因?yàn)槊愋筒荒芟嗷シ峙?。但是,?dāng)兩種類型共享相同的基礎(chǔ)類型時(shí),命名類型可分配給未命名類型。將參數(shù)聲明為未命名類型:
func AcceptBarOrFoo(struct {
iface.FooI
X string
}) interface{} {
return nil
}
通過這些更改,可以編譯以下代碼:
AcceptBarOrFoo(bar.Bar{})
AcceptBarOrFoo(foo.Foo{})
在 Go 操場上運(yùn)行示例
另一種選擇是使用到通用類型的轉(zhuǎn)換。在下面的代碼中,foo.Foo 是普通類型,bar.Bar 被轉(zhuǎn)換為 foo.Foo。
func Accept(foo.Foo) interface{} {
return nil
}
...
Accept(foo.Foo{})
Accept(foo.Foo(bar.Bar{}))
在 Go playground 上運(yùn)行示例。
注意:foo.Foo 和 bar.Bar 必須具有相同的字段才能使上述工作正常(導(dǎo)出字段名稱,字段順序相同,字段類型相同)。
關(guān)于 Go 的一些注意事項(xiàng):
存在從一種具體類型到另一種具體類型的轉(zhuǎn)換。
Go 以表達(dá)式中沒有隱式轉(zhuǎn)換而聞名,但在某些賦值場景中存在隱式轉(zhuǎn)換。
- 2 回答
- 0 關(guān)注
- 163 瀏覽
添加回答
舉報(bào)
