我很好奇,爲什麼go不會將[]T
轉換爲[]interface{}
,因爲它會隱式地將T
轉換爲interface{}
。這種轉換有什麼不重要的東西,我錯過了嗎?轉換接口片的轉換
實施例:
func foo([]interface{}) { /* do something */ }
func main() {
var a []string = []string{"hello", "world"}
foo(a)
}
go build
抱怨
不能使用(類型[]字符串)作爲類型[]接口{}函數自變量
如果我嘗試明確地做,同樣的事情:b := []interface{}(a)
抱怨
不能轉換(類型[]字符串)鍵入[]接口{}
所以每次我需要做這種轉換(這似乎來了很多)的時候,我一直在做像這樣:
b = make([]interface{}, len(a), len(a))
for i := range a {
b[i] = a[i]
}
有沒有更好的方法來做到這一點,或標準庫函數來幫助這些轉換?每次我想調用一個函數時,寫出4行額外的代碼看起來很愚蠢。整數或字符串。
這樣定義「隱式轉換[] T,爲[]接口{}」來表示「分配一個新的切片,並在複製的所有元素」。這與「將T隱式轉換爲接口{}」不一致,它只是與更通用的靜態類型相同的值;沒有被複制;如果你鍵入 - 斷言它回到類型T,你仍然會得到相同的東西。 – newacct
沒有詳細考慮如何實現,只是在更高層次上,能夠輕鬆地將整個列表轉換爲另一種類型作爲不具有泛型類型的解決方法。 – danny
好問題。 :) – weberc2