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后備存儲,長度為零,容量為零。
這就是為什么test1
is 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.Pointer
Go 是否實際為后備數組分配了任何存儲空間。您對切片執行的任何操作都可以為其提供一些容量,以便您可以將一些值放入內存中的某個位置,都將或可能只是分配一個新的后備數組。該包有一些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 關注
- 345 瀏覽
添加回答
舉報