第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

為什么 []string 不能在 golang 中轉(zhuǎn)換為 []interface{}

為什么 []string 不能在 golang 中轉(zhuǎn)換為 []interface{}

Go
白衣非少年 2021-07-08 14:05:31
我發(fā)現(xiàn)它很奇怪,為什么 []string 不能轉(zhuǎn)換為 []interface{} ?我認為應該是可能的,因為:它們都是切片[]string的每一個元素都是字符串,當然是interface{}但在下面的例子中,這將是一個編譯錯誤func f(args ...interface{}){}s := []string{"ssd", "rtt"}f(s...)為什么語言不能自動完成轉(zhuǎn)換?
查看完整描述

2 回答

?
慕運維8079593

TA貢獻1876條經(jīng)驗 獲得超5個贊

Slice 基本上只是對底層數(shù)組、起始指針、長度和容量的引用。因此,如果可能的話,請考慮以下事項:


sliceOfStrings := []string{"one", "two", "three"}

// prints ONE TWO THREE

for i := range sliceOfStrings {

    fmt.Println(strings.ToUpper(sliceOfStrings[i]))

}


// imagine this is possible

var sliceOfInterface = []interface{}(sliceOfStrings)

// since it's array of interface{} now - we can do anything

// let's put integer into the first position

sliceOfInterface[0] = 1

// sliceOfStrings still points to the same array, and now "one" is replaced by 1

fmt.Println(strings.ToUpper(sliceOfStrings[0])) // BANG!

此問題存在于 Java 和 C# 中。在實踐中它很少發(fā)生,但仍然發(fā)生。鑒于在 Go 中沒有像 int32 -> int64 這樣的自動類型轉(zhuǎn)換,如果你真的想將 []string 作為 []interface{} 發(fā)送,你被迫創(chuàng)建一個 []interface{} 副本是有道理的。這樣就不會令人驚訝了 - 你明確地寫了它,你知道你在做什么。如果函數(shù)會修改 []interface{} - 它不會傷害原始的 []string。


查看完整回答
反對 回復 2021-07-19
?
郎朗坤

TA貢獻1921條經(jīng)驗 獲得超9個贊

因為[]string[]interface{}有不同的內(nèi)存布局。當您意識到一個interface{}變量需要知道它所包含的值的類型時,這一點很明顯。

對于[]string切片,后備數(shù)組只需要保存單個字符串。對于[]interface{}切片,您已經(jīng)獲得了類型信息和字符串值(嗯,指向字符串值的指針,因為字符串大于內(nèi)存中的單個字)。因此,從一種類型轉(zhuǎn)換為另一種類型將涉及復制數(shù)據(jù)。

Go 自動執(zhí)行轉(zhuǎn)換會令人困惑,因為它會使代碼推理變得困難。例如,函數(shù)調(diào)用f(s)可以修改切片中的字符串,s如果它被聲明為接受一個[]string參數(shù),但如果它被聲明為接受一個參數(shù),則不能[]interface{}。


查看完整回答
反對 回復 2021-07-19
  • 2 回答
  • 0 關(guān)注
  • 856 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號