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

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

在GO中輸入接口轉換片

在GO中輸入接口轉換片

Go
冉冉說 2019-06-26 16:50:35
在GO中輸入接口轉換片我很好奇為什么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行額外的代碼,這似乎有點愚蠢,該函數可以接收例如INT或字符串的列表。
查看完整描述

3 回答

?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

你錯過的是Tinterface{}它的值為T內存中有不同的表示形式,因此不能進行瑣碎的轉換。

類型變量T只是它在記憶中的價值。沒有關聯的類型信息(在Go中,每個變量都有一個在編譯時已知的類型,而不是在運行時已知)。它在內存中如下所示:

  • 價值

interface{}持有類型的變量T在內存中表示,如下所示

  • 指向類型的指針

    T

  • 價值

回到你最初的問題:為什么Go不隱式轉換[]T[]interface{}?

轉換[]T[]interface{}將涉及創建一個新的interface {}值,這是一個非平凡的操作,因為內存中的布局是完全不同的。


查看完整回答
反對 回復 2019-06-26
  • 3 回答
  • 0 關注
  • 689 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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