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)”的接口值。
如果傳遞nil
給reflect.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
- 1 回答
- 0 關(guān)注
- 127 瀏覽
添加回答
舉報(bào)