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

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

接口切片的類型轉換

接口切片的類型轉換

Go
慕絲7291255 2021-04-30 13:14:51
我很好奇為什么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 {}值切片,這是不平凡的操作,因為內存中的布局完全不同。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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