nil 和空切片
有時,程序可能需要聲明一個值為 nil 的切片(也稱nil切片)。只要在聲明時不做任何初始化,就會創建一個 nil 切片。
var num []int
在 Golang 中,nil 切片是很常見的創建切片的方法。nil 切片可以用于很多標準庫和內置函數。在需要描述一個不存在的切片時,nil 切片會很好用。比如,函數要求返回一個切片但是發生異常的時候。下圖描述了 nil 切片的狀態:
空切片和 nil 切片稍有不同,下面的代碼分別通過 make() 函數和字面量的方式創建空切片:
num := make([]int, 0) // 使用 make 創建空的整型切片
num := []int{} // 使用切片字面量創建空的整型切片
空切片的底層數組中包含 0 個元素,也沒有分配任何存儲空間。想表示空集合時空切片很有用,比如,數據庫查詢返回 0 個查詢結果時。
不管是使用 nil 切片還是空切片,對其調用內置函數 append()、len() 和 cap() 的效果都是一樣的。
共享底層數組的切片
需要注意的是:現在兩個切片 num 和 myNum 共享同一個底層數組。如果一個切片修改了該底層數組的共享部分,另一個切片也能感知到:
// 修改 myNum 索引為 1 的元素
// 同時也修改了原切片 num 的索引為 2 的元素
myNum[1] = 35
把 35 賦值給 myNum 索引為 1 的元素的同時也是在修改 num 索引為 2 的元素:
切片只能訪問到其長度內的元素
切片只能訪問到其長度內的元素,試圖訪問超出其長度的元素將會導致語言運行時異常。在使用這部分元素前,必須將其合并到切片的長度里。下面的代碼試圖為 num 中的元素賦值:
// 修改 newNum 索引為 3 的元素
// 這個元素對于 newNum 來說并不存在
newNum[3] = 45
上面的代碼可以通過編譯,但是會產生運行時錯誤:panic: runtime error: index out of range
-
數據結構
+關注
關注
3文章
573瀏覽量
40123 -
數組
+關注
關注
1文章
417瀏覽量
25939 -
切片
+關注
關注
1文章
22瀏覽量
8448
發布評論請先 登錄
相關推薦
評論