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