slice(切片)代表變長的序列,序列中每個元素都有相同的型別。乙個slice型別一般寫作t,其中t代表slice中元素的型別;slice的語法和陣列很像,只是沒有固定長度而已。
乙個slice由三個部分構成:指標、長度和容量。指標指向第乙個slice元素對應的底層陣列元素的位址,要注意的是slice的第乙個元素並不一定就是陣列的第乙個元素。長度對應slice中元素的數目;長度不能超過容量,容量一般是從slice的開始位置到底層資料的結尾位置。內建的len和cap函式分別返回slice的長度和容量。
slice的切片操作s[i:j],其中0 ≤ i≤ j≤ cap(s),用於建立乙個新的slice,引用s的從第i個元素開始到第j-1個元素的子串行。新的slice將只有j-i個元素。如果i位置的索引被省略的話將使用0代替,如果j位置的索引被省略的話將使用len(s)代替。
slice唯一合法的比較操作是和nil比較,例如:
if summer == nil乙個零值的slice等於nil。乙個nil值的slice並沒有底層陣列。乙個nil值的slice的長度和容量都是0,但是也有非nil值的slice的長度和容量也是0的,例如int{}或make(int, 3)[3:]
內建的make函式建立乙個指定元素型別、長度和容量的slice。容量部分可以省略,在這種情況下,容量將等於長度。
make(t, len)make(t, len, cap)
//same as make(t, cap)[:len]
func main()}
0 cap=1 [0push v]1 cap=2 [01]
2 cap=4 [012
]3 cap=4 [012
3]4 cap=8 [012
34]5 cap=8 [012
345]
6 cap=8 [012
3456
]7 cap=8 [012
3456
7]8 cap=16 [012
3456
78]9 cap=16 [012
3456
789]
stack的頂部位置對應slice的最後乙個元素:
top := stack[len(stack)-1] //通過收縮stack可以彈出棧頂的元素top of stack
stack = stack[:len(stack)-1] //要刪除slice中間的某個元素並儲存原有的元素順序,可以通過內建的copy函式將後面的子slice向前依次移動一位完成:pop
func remove(slice int, i int) int如果刪除元素後不用保持原來順序的話,我們可以簡單的用最後乙個元素覆蓋被刪除的元素:func main()
fmt.println(remove(s,
2)) //
"[5 6 8 9]"
}
func remove(slice int, i int) int雜湊表是個用途比較廣泛的結構,是乙個擁有鍵值對的無序集合,這個集合中 鍵的值是唯一的;func main()
fmt.println(remove(s,
2)) //
"[5 6 9 8]
}
go語言中,乙個map就是乙個雜湊表的引用,map型別可以寫為map[k]v,其中k和v分別對應key和value。map中所有的key都有相同的型別,所有的value也有著相同的型別,但是key和value之間可以是不同的資料型別。其中k對應的key必須是支援==比較運算子的資料型別,所以map可以通過測試key是否相等來判斷是否已經存在。雖然浮點數型別也是支援相等運算子比較的,但是將浮點數用做key型別則是乙個壞的想法,對於v對應的value資料型別則沒有任何的限制。
內建的make函式可以建立乙個map:
ages := make(map[string]int) //也可以使用如下方式初始化
ages := map[string]int這相當於:
ages := make(map[string]int所以,另一種建立空的map的表示式是)ages[
"alice
"] = 31
ages[
"charlie
"] = 34
map[string]int{}map中的元素通過key對應的下標語法訪問:
ages["使用內建的delete函式可以刪除元素:alice
"] = 32
fmt.println(ages[
"alice
"]) //
"32"
delete(ages, "map的迭代順序是不確定的,並且不同的雜湊函式實現可能導致不同的遍歷順序。在實踐中,遍歷的順序是隨機的,每一次遍歷的順序都不相同。這是故意的,每次都使用隨機的遍歷順序可以強制要求程式不會依賴具體的雜湊函式實現。如果要按順序遍歷key/value對,我們必須顯式地對key進行排序,可以使用sort包的strings函式對字串slice進行排序alice
") //
remove element ages["alice"]
import "map型別的零值是nil,也就是沒有引用任何雜湊表sort
"var names string
for name :=range ages
sort.strings(names)
for _, name :=range names
var ages map[string]intmap上的大部分操作,包括查詢、刪除、len和range迴圈都可以安全工作在nil值的map上,它們的行為和乙個空的map類似。但是向乙個nil值的map存入元素將導致乙個panic異常:在向map存資料前必須先建立map。fmt.println(ages == nil) //
"true"
fmt.println(len(ages) == 0) //
"true"
![](https://pic.w3help.cc/0bb/cf4142f50ba64bb37ed6969462392.jpeg)
通過key作為索引下標來訪問map將產生乙個value。如果key在map中是存在的,那麼將得到與key對應的value;如果key不存在,那麼將得到value對應型別的零值,正如我們前面看到的ages["bob"]那樣。這個規則很實用,但是有時候可能需要知道對應的元素是否真的是在map之中。例如,如果元素型別是乙個數字,你可能需要區分乙個已經存在的0,和不存在而返回零值的0,可以像下面這樣測試:
age, ok := ages["在這種場景下,map的下標語法將產生兩個值;第二個是乙個布林值,用於報告元素是否真的存在。布林變數一般命名為ok,特別適合馬上用於if條件判斷部分。bob"
]if !ok
python讀書筆記 資料型別擴充套件
python 數字資料型別用於儲存數值。資料型別是不允許改變的,這就意味著如果改變量字資料型別的值,將重新分配記憶體空間。python 支援三種不同的數值型別 整型 int 通常被稱為是整型或整數,是正或負整數,不帶小數點。python3 整型是沒有限制大小的,可以當作 long 型別使用,所以py...
MySql資料型別 讀書筆記
一.選擇優化的資料型別 更小的通常更好 在允許的情況下,應該盡量使用可以正確儲存資料的最小資料型別,因為占用更少的磁碟,記憶體和cpu快取,處理周期短,例如只要儲存0 200,tinyint unsigned 更好 簡單就好 例如整型比字元型操作代價更低,因為字符集和校對規則 排序規則 使字串比較比...
golang 讀書筆記
go語言是一種讓 分享更容易的程式語言。go語言自帶一些工具,讓使用別人寫的包更容易,並且分享自己寫的包更容易。go語言對併發的支援是這門語言最重要的特性之一。goroutine很像執行緒,但是它占用的記憶體遠少於執行緒,使用它需要的 更少。通道 channel 是一種內建的資料結構,可以讓使用者在...