2 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊
就其本身而言,是 的類型切片的[]int
拼寫。int
在:
var?test1?[]int
提供[]int
變量的類型test1
。該行作為一個(gè)整體不提供任何值,因此test1
被初始化為type 的零值[]int
。它的零值是[]int(nil)
,或者非正式地,就是 nil 。1
在:
test2?:=?[]int{}
提供[]int
大括號(hào)括起來的初始值設(shè)定項(xiàng)列表的類型。也就是說,{}
是一個(gè)復(fù)合文字:一個(gè)左大括號(hào),后跟一個(gè)元素列表(在本例中為空),后跟一個(gè)右大括號(hào)。該行的其余部分(:=
左側(cè)的 和變量名稱)表示一個(gè)簡短的變量聲明。這為變量提供了類型test2
,以及空列表生成的值。?[]int
在這種情況下,空列表生成的值是 的一個(gè)空切片int
: 1 具有空的2后備存儲(chǔ),長度為零,容量為零。
這就是為什么test1
is nil 但test2
不是:test1
保存零值,對(duì)于任何切片類型來說,都是nil
(nil
無論如何轉(zhuǎn)換為該類型之后)。同時(shí)test2
保存由三部分組成的切片頭,該頭覆蓋由復(fù)合文字創(chuàng)建的零長度支持?jǐn)?shù)組。
一個(gè) nil 切片——這是一個(gè)有點(diǎn)草率的措辭:它意味著一個(gè) slice-of 類型的值,T
其實(shí)際值[]T(nil)
而不是某些由三部分組成的切片頭——通??梢?em>用作相同類型。特別是,for i := range x
兩者x = append(x, newElement)
都處理得x == nil
“很好”:它們對(duì)待它的方式與對(duì)待空切片的方式相同。打印切片的例程fmt
也執(zhí)行此操作。3
1nil
本身是無類型的。nil
請(qǐng)參閱 Go 規(guī)范中變量部分下第一次提到的。
2至少在沒有使用或類似的情況下,不可能判斷unsafe.Pointer
Go 是否實(shí)際為后備數(shù)組分配了任何存儲(chǔ)空間。您對(duì)切片執(zhí)行的任何操作都可以為其提供一些容量,以便您可以將一些值放入內(nèi)存中的某個(gè)位置,都將或可能只是分配一個(gè)新的后備數(shù)組。該包有一些unsafe
用于查看 Go 運(yùn)行時(shí)的技巧,但一般來說,您不需要也不應(yīng)該這樣做。
3相比之下,map
類型的表現(xiàn)就沒那么好了。如果x
是(非正式地說)一個(gè)可能為零的切片,并且m
是一個(gè)可能為零的映射,我們可以這樣做:
x?=?append(x,?newElem)
但我們不能這樣做:
m[key]?=?newElem
我們必須首先檢查是否m
為 nil,如果是,則分配一個(gè)空映射:
if?m?==?nil?{ ????m?=?make(...)?//?put?in?the?right?type?here ????} m[key]?=?newElem
所以比較常用的是:
var?x?[]T m?:=?map[string]T{}
就在彼此旁邊,因?yàn)?code>x會(huì)表現(xiàn)得很好,也m
不會(huì)表現(xiàn)得很好。

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
這是 nil 和空切片之間的區(qū)別。在golang中,如果你聲明一個(gè)沒有值的變量,它的值將成為該變量類型的零值。數(shù)組的零值為 nil。不是空切片。可以使用 make 函數(shù)或 Shorty 用于 test2 的第二種方法來生成空切片
- 2 回答
- 0 關(guān)注
- 335 瀏覽
添加回答
舉報(bào)