我很好奇為什么Go不會隱式轉換[]T為[]interface{},而Go會隱式轉換T為interface{}。我缺少這種轉換的重要內容嗎?例子:func foo([]interface{}) { /* do something */ }func main() { var a []string = []string{"hello", "world"} foo(a)}go build 抱怨不能在函數參數中使用(類型[]字符串)作為類型[] interface {}如果我嘗試顯式地執行此操作,則會遇到同樣的事情:b := []interface{}(a)抱怨無法將(類型[]字符串)轉換為類型[] interface {}因此,每次我需要進行這種轉換時(這似乎很多),我一直在做這樣的事情:b = make([]interface{}, len(a), len(a))for i := range a { b[i] = a[i]}有沒有更好的方法可以做到這一點,或者有標準的庫函數來幫助實現這些轉換?每次我想調用一個可以接收例如int或字符串列表的函數時,多寫4行代碼似乎是很愚蠢的。
3 回答

楊__羊羊
TA貢獻1943條經驗 獲得超7個贊
您所缺少的是,T
并且interface{}
它T
在內存中具有不同的表示形式,因此不能輕易轉換。
類型變量T
就是它在內存中的值。沒有關聯的類型信息(在Go中,每個變量在編譯時而不是運行時都有一個已知的單一類型)。它在內存中的表示方式如下:
價值
一個interface{}
類型的保持變量T
在這樣存儲器表示
類型的指針
T
價值
現在回到您的原始問題:為什么go不會隱式轉換[]T
為[]interface{}
?
轉換[]T
為[]interface{}
涉及創建新的interface {}
值切片,這是不平凡的操作,因為內存中的布局完全不同。
- 3 回答
- 0 關注
- 322 瀏覽
添加回答
舉報
0/150
提交
取消