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

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

如何通過 reflect.Append 將 nil 附加到動態(tài)類型切片

如何通過 reflect.Append 將 nil 附加到動態(tài)類型切片

Go
繁星coding 2023-06-19 17:47:32
reflect.Value下面的代碼將在追加時引發(fā)運(yùn)行時錯誤nil:package mainimport (    "fmt"    "reflect")func main() {    var list []interface{}    v := reflect.ValueOf(list)    v = reflect.Append(v, reflect.ValueOf(1))   // [1]    v = reflect.Append(v, reflect.ValueOf("1")) // [1, 1]    v = reflect.Append(v, reflect.ValueOf(nil)) // runtime error    fmt.Println(v)}所以為什么會出現(xiàn)運(yùn)行時錯誤?我怎樣才能使用reflect.Append添加nil到interface{}切片?
查看完整描述

1 回答

?
縹緲止盈

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個贊

interface{}是一種接口類型,它們很“棘手”。它們是具體值和具體類型的包裝器,示意性地是(值,類型)對。

因此,當(dāng)您將具體值傳遞給需要值的函數(shù)時interface{},具體值將interface{}自動隱式地包裝在一個值中。如果將 a 傳遞nil給這樣的函數(shù),則接口值本身將為nil.?如果你傳遞一個nil指向它的指針,比如(*int)(nil),接口值將不會是nil一個持有“(nil, *int)”的接口值。

如果傳遞nilreflect.ValueOf(),它會產(chǎn)生一個“零”?reflect.Value,表示根本沒有值。如果將其傳遞給reflect.Append(),它將沒有類型信息,也不知道要將什么附加到切片中。

可以創(chuàng)建表示nil接口值的值。

為此,我們可以從接口指針值的類型描述符開始(指向接口的指針很少有意義,但這就是其中之一)。我們導(dǎo)航到指向類型的類型描述符,即interface{}.?我們獲得此類型的零值(使用reflect.Zero()),即nil(接口類型的零值是nil)。

零返回一個值,表示指定類型的零值。結(jié)果與 Value 結(jié)構(gòu)的零值不同,后者表示根本沒有值。

所以這就是它的樣子:

typeOfEmptyIface := reflect.TypeOf((*interface{})(nil)).Elem()

valueOfZeroEmptyIface := reflect.Zero(typeOfEmptyIface)

v = reflect.Append(v, valueOfZeroEmptyIface)

或者作為單行:


v = reflect.Append(v, reflect.Zero(reflect.TypeOf((*interface{})(nil)).Elem()))

要檢查結(jié)果,讓我們使用:


fmt.Printf("%#v\n", v)

并且讓我們對切片進(jìn)行類型斷言,并nil使用內(nèi)置append()函數(shù)添加一個值:


list = v.Interface().([]interface{})

list = append(list, nil)

fmt.Printf("%#v\n", list)

讓我們做一個明確的額外檢查元素是否是nil(將它們與 進(jìn)行比較nil)。盡管使用%#v動詞 this 是多余的,但%v喜歡打印nil持有nil具體值的非接口 as nil(就像接口值本身一樣nil)。


fmt.Println(list[2] == nil, list[3] == nil)

輸出將是(在Go Playground上嘗試):


[]interface {}{1, "1", interface {}(nil)}

[]interface {}{1, "1", interface {}(nil), interface {}(nil)}

true true



查看完整回答
反對 回復(fù) 2023-06-19
  • 1 回答
  • 0 關(guān)注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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