原型函數func test(i ...interface{}) { // Code here}有可能的使用type foo struct { // Fields}foos := []foo{ // foo1, foo2 ...}test(foos...) // ERRORtest(foos[1], foos[2], ...) // OK錯誤無法使用 foos([]foos 類型的變量)作為要測試的參數中的 []interface{} 值描述預期用途是像內置函數一樣使用append()。https://golang.google.cn/pkg/builtin/#appendfunc append(slice []Type, elems ...Type) []Type雖然,正如我所見,append()不使用interface{},這很奇怪,因為在我搜索的任何地方,所有人都說interface{}當您不知道類型時使用。但他們沒有。不,append()使用名為 的“內置”類型Type,顯然文檔說它是一個int. 雖然,我不能使用它。沒有這種類型。如果有的話我也不知道如何使用它。https://golang.google.cn/pkg/builtin/#Typetype Type int所以,我在這里很困惑。問題為什么展開運算符不能按預期工作?例如,在 Javascript 中,擴展運算符只是將數組擴展為項目。但在 Golang 中,它似乎保留了相同的數組參數類型,但稍后給編譯器提供了傳播它的指令。這很奇怪。我們是否能夠制作類似的自定義機制append()?或者我是一個假人,我無論如何都使用了錯誤的東西?
3 回答

ABOUTYOU
TA貢獻1812條經驗 獲得超5個贊
我認為這就是您在這里遇到的問題。
https://github.com/golang/go/wiki/InterfaceSlice
我不是這方面的專家,但之前已經遇到過這個問題,“空接口切片”不是一個接口,因此不能被任何類型替換,這是您遇到的問題,它與內存結構有關不同的。上面的解釋比我能給出的解釋要好得多。

小唯快跑啊
TA貢獻1863條經驗 獲得超2個贊
您可以對鍵入的切片進行類型轉換以獲得所需的內容:
generic := make([]interface{}, 0)
for _, f := range foos {
generic = append(generic, f)
}
test(generic...) // works

人到中年有點甜
TA貢獻1895條經驗 獲得超7個贊
將兩個非否定答案結合成我認為最好的解決方案:
interfaceSlice := make([]interface{}, len(foos))
for i, v := range foos {
interfaceSlice[i] = v
}
test(interfaceSlice...)
部分靈感來自:
https://github.com/golang/go/wiki/InterfaceSlice#what-can-i-do-instead
- 3 回答
- 0 關注
- 159 瀏覽
添加回答
舉報
0/150
提交
取消