我想了解Go的類型轉換規則。假設我們有以下接口:爲什麼我無法在Go中替換另一種類型的切片?
type woofer interface {
woof()
}
type runner interface {
run()
}
type woofRunner interface {
woofer
runner
}
,並滿足我們有一個dog
類型的接口:
type dog struct{}
func (*dog) run() {}
func (*dog) woof() {}
這兩個功能使用的接口:
func allWoof(ws []woofer) {}
func oneWoof(w woofer) {}
要使用這些方法我可以寫下:
dogs := make([]woofRunner, 10)
oneWoof(dogs[0])
allWoof(dogs)
第一個功能oneWoof()
按預期工作;一個*dog
實現所有oneWoof
需求,這是一個woof
函數。
不過,對於第二個功能allWoof
,圍棋將無法編譯嘗試調用,報告如下:
不能用狗(型[] woofRunner)類型[]低音單元在爭論allWoof
使用類型轉換也是不可能的;寫[]woofer(dogs)
也將失敗:
不能將狗(型[] woofRunner)鍵入[]低音單元
的[]woofRunner
每一個成員都擁有所有必要的功能,以滿足[]woofer
,所以這是爲什麼禁止轉換?
(我不知道這是否是相同的情況下,在圍棋FAQ並在堆棧溢出,使人們問轉換類型T
到interface{}
各種問題解釋切片/陣列中的每個指針指向。我知道一個解決方案是在循環和並轉換:即直接轉換爲另一種類型使用這些指針應爲同樣的原因,經過dog[0]
爲「oneWoof`是可能的)
注1可能項目逐一。我的問題是爲什麼這是必要的,是否有更好的解決方案。
注2:就Assignability規則:
甲值x可分配給類型的T A變量[時] T是一個接口類型以及x實現T.
難道我們不能說切片/數組的類型是否可以分配給另一種類型,那麼這些類型的數組也可以賦值?
https://golang.org/ref/spec#Assignability因此,賦值不符合語言標準可分配性規則。 – zerkms
原因:因爲這就是類型轉換的工作原理。不,沒有更好的解決方案。 – Flimzy
請參閱https://golang.org/doc/faq#convert_slice_of_interface。經驗法則:檢查有效圍棋,常見問題解答,圍棋之旅和語言規範。答案就在那裏。 – Volker