亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

傳播[重復]時“無法使用[]結構類型的變量作為[]接口”

傳播[重復]時“無法使用[]結構類型的變量作為[]接口”

Go
牛魔王的故事 2023-07-17 16:34:03
原型函數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

我不是這方面的專家,但之前已經遇到過這個問題,“空接口切片”不是一個接口,因此不能被任何類型替換,這是您遇到的問題,它與內存結構有關不同的。上面的解釋比我能給出的解釋要好得多。


查看完整回答
反對 回復 2023-07-17
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

您可以對鍵入的切片進行類型轉換以獲得所需的內容:


generic := make([]interface{}, 0)

for _, f := range foos {

  generic = append(generic, f)

}

test(generic...)  // works


查看完整回答
反對 回復 2023-07-17
?
人到中年有點甜

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


查看完整回答
反對 回復 2023-07-17
  • 3 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號