您好,登錄后才能下訂單哦!
這篇文章主要講解了“Golang中的nil和零值怎么聲明”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Golang中的nil和零值怎么聲明”吧!
在go中類型可以是空或非空。 非空類型永遠不能為nil,并且永遠不會使您導致 nil-panic
(等效于Java的nullpointerexception) 盡管不像java(或其他具有空類型的語言)中那么多,但在處理空類型時,我們仍須謹慎一點。
非空基本類型
在go中,基本類型不可為空。像這樣的聲明
var a int = nil
無法編譯,因為int
永遠不能為nil. 未分配的int
類型的默認值為0.
運行語句
var a int // int類型的默認值不能為nil
fmt.Println(a) // 0
將輸出int
的默認值 “0
”. 我們將此稱為類型的零值.
同int
默認為0一樣, 以下是其他默認值為零值的基礎類型:
Types | Zero value |
---|---|
int, int8, int16, int32, int64 | 0 |
uint, uint8, uint16, uint32, uint64 | 0 |
uintptr | 0 |
float32, float64 | 0.0 |
byte | 0 |
rune | 0 |
string | "” (empty string) |
complex64, complex128 | (0,0i) |
arrays of non-nillable types | array of zero-values |
arrays of nillable types | array of nil-values |
Non-nillable structs
組合的struct
類型也是不可空的,并且struct的默認值將包含其所有字段的默認值。
設定一個 Person 結構體的代碼,
type Person struct {
Name string
Age int
}
var p Person // person 類型的默認 0 值
fmt.Printf("[%#v]\n", p)
當你在 main 方法里運行這段代碼的時候,將會打印出 [main.Person{Name:"", Age:0}]
你可以在 Go Playground 上運行這段代碼進行測試。
nillable 類型
還有一種更高級到 nillable 類型,如果對應的類型未初始化,將會報錯,觸發 panic 。
這些可以為 nillabel 類型的 函數,通道,切片,map,接口以及指針.
但是,nil-slice 和nil-maps 仍然可以使用,在我們開始使用它們之前不必進行初始化。
nil-maps
如果 map 的值為 nil,map 將始終返回值的零值,與返回不存在 map 中的 Key 的結果一樣。代碼
var p map[int]string // nil map
fmt.Printf(" %#v length %d \n", p[99], len(p))
讓我們來打印下 "" length 0
, 我們可以獲得鍵為99的字符串string
的值為零.
將值分配給 nil-map, 會引起死機狀況的出現:
var p map[string]int // nil map
p["nils"] = 19 // panic: 對nil-map中的條目賦值
nil-slices
在外部引用切片 will 將導致死機,但是 len()
和 cap()
的操作不會導致死機出現. 他們只返回 0
, 因為對于未初始化的切片,其容量和長度都為零. 所以他們可以在nil-slice上成功調用append. 示例代碼如下:
var p []string // nil slice
fmt.Printf("uninitialized -> %d, %d\n", len(p), cap(p))
p1 := append(p, "nils") // 從P創建一個新的切片p1
fmt.Printf("after append -> %d, %d %#v\n", len(p1), cap(p1), p1)
會打印:
uninitialized -> 0, 0
after append -> 1, 1 []string{"nils"}
在 Go Playground 上試驗。
可為 nil 值的指針、函數和接口類型會引起 panic
Pointers and interface-types are however nillable. Whenever dealing with these types, we have to consider if they are nil or not to avoid panics. These code-snippets for instance, will cause a panic:
指針和接口類型是可為 nil 值的。每當處理這些類型時,我們都必須考慮它們是否為零,以免出現 Panic。例如,這些代碼片段將引起 Panic:
var p *int // 指向 int 的指針
*p++ // panic: runtime error: invalid memory address or nil pointer dereference
// p是無內容的地址,因此為nil
和
var p error // 類型 error 的 nil 值
error.Error() // panic: runtime error: invalid memory address or nil pointer dereference
和
var f func(string) // nil 函數
f("oh oh") // panic: runtime error: invalid memory address or nil pointer dereference
nil channel 永遠阻塞
嘗試從 nil 通道讀取或寫入 nil 通道將永遠受阻。關閉nil通道會引起 Panic 。
感謝各位的閱讀,以上就是“Golang中的nil和零值怎么聲明”的內容了,經過本文的學習后,相信大家對Golang中的nil和零值怎么聲明這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。