目錄
- 復合資料型別
- 陣列
- slice
復合資料型別
陣列
- 長度固定,有零個或者多個元素組成,
- 默認情況下,陣列的每個元素都被初始化為元素型別零值,
- 如果陣列的長度位置出現
...,則表示陣列長度是根據初始值的個數來計算,如:q := [...]int{1, 2, 3} - 如果指定索引和對應值串列的方式初始化,這種情形下初始化索引的順序是無關緊要的,而且沒有用到的索引可以省略,未指定初始值的元素將使用零值初始化,如:
r := [...]int{99: -1}定義了一個含有100個元素的陣列, - 如果一個陣列的元素型別是可以比較的,那么陣列型別也是可以比較的,可以使用
==、!=來進行比較,僅當陣列長度和元素完全相等時,為true,長度不相等的陣列進行等值對比是會報編譯錯誤compile error: cannot compare [2]int == [3]int
slice
- 變長序列,序列中每個元素都有相同的型別,一個
slice型別一般寫作[]T,其中T代表slice中的型別, - 由指標、長度、容量構成,指標指向第一個
slice元素對應的底層陣列元素的地址(PS:slice的第一個元素并不一定就是陣列的第一個元素),長度對應slice的元素數目,長度不能超過容量,容量一般是從slice的開始位置到底層資料的結尾位置,內置的len和cap分別回傳slice的長度和容量, - 多個
slice之間可以共享底層的資料,并且參考的陣列部磁區間可能重疊, slice之間不能比較,意味著不能使用==、!=運算子來進行判斷兩個切片是否含有全部相等的元素,標準庫中提供了bytes.Equal函式來判斷兩個位元組型切片是否相等([]byte),對于其他型別的切片需要我們自己來展開比較,切片不支持比較的原因:
- 切片元素是間接參考的,一個切片甚至可以包含自身(當
slice宣告為[]interface{}時,slice的元素可以是自身) - 因為
slice元素是間接參考的,一個固定的slice值(指slice本身的值,不是元素的值)在不同時刻可能包含不同元素,因為底層陣列的元素可能會被修改,
- 切片元素是間接參考的,一個切片甚至可以包含自身(當
slice唯一合法的比較操作是和nil做比較(if summer == nil { /* ... */ }),零值的
slice等于nil,
nil值的slice沒有底層陣列
nil值的slice的長度和容量都是0,但是也有非nil值的slice的長度和容量為0的,如[]int{}、make([]int, 3)[3:],可以用[]int(nil)型別轉換運算式來生成一個對應型別的slice的nil值,var s []int // len(s) == 0, s == nil s = nil // len(s) == 0, s == nil s = []int(nil) // len(s) == 0, s == nil s = []int{} // len(s) == 0, s != nil- 如果要測驗一個
slice是否是空的,使用len(s) == 0來判斷,而不是s == nil, - 內置的
make函式可以創建指定型別、長度和容量的切片,容量部分可以省略,這種情況下,容量等于長度,make([]T, len, cap) - 盡管底層陣列的元素是間接訪問的,但是
slice對應結構體本身的指標、長度和容量部分都是直接訪問的,一般操作slice后會重新賦值給變數,如:runes = append(runes, r) appendInt引數的省略號...代表接受變長的引數為slicefunc appendInt(x []int, y ...int) []int { var z []int zlen := len(x) + len(y) // ...expand z to at least zlen... copy(z[len(x):], y) return z }- 要洗掉slice中間的某個元素并保存原有的元素順序,可以通過內置的copy函式將后面的子slice向前依次移動一位完成
如果洗掉元素后不用保持原來順序的話,我們可以簡單的用最后一個元素覆寫被洗掉的元素func remove(slice []int, i int) []int { copy(slice[i:], slice[i+1:]) return slice[:len(slice)-1] }func remove(slice []int, i int) []int { slice[i] = slice[len(slice)-1] return slice[:len(slice)-1] }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/499844.html
標籤:其他
上一篇:Python生成字母對后寫入檔案
