go語言中數組的特色:python
數組的長度是固定的,而且長度也是數組類型的一部分
是值類型,在賦值或者做爲參數傳遞時,會複製整個數組,而不是指針
定義數組的語法:數組
var arr1 = [5]int{1,2} // [5]int{1, 2, 0, 0, 0} 未初始化的值,就默認初始化爲該類型的默認值 var arr2 = [...]int{1,2,3} // [3]int{1,2,3} 長度可由初始化的元素個數肯定 var arr3 = [5]int{1: 20, 4: 50} // 可以使用索引來初始化,其餘值仍然是對應類型的默認值 var arr4 = [2][3]int{{1,2,3}, {2,3,4}} // 多維數組
能夠直接使用索引值訪問數據結構
var arr = [5]string{"hello", "a", "b", "world", "sss"} // 這裏只接收一個值,那這個值就是索引值 for i := range arr { fmt.Println(arr[i]); } // 接收兩個值,就分別是索引值 和 索引對應的數組值 for i, v := range arr { fmt.Println(i, v); }
len 和 cap 方法均可以返回數組長度,即元素數量app
slice的底層是數組,它經過內部指針和一些相關屬性來引用數組片斷,因此slice是能夠變長的函數
slice的結構:性能
struct Slice { byte* array; uintgo len; uintgo cap; }
切片slice的特色:測試
// 經過數組產出切片 var arr = [8]int{2,3,5,7,4,6,9,10} var s1 = arr[1:5:6] // 語法 [start: end: max], 此時 len = end - start, cap = max-start // 直接建立切片 var s2 = []int{2,4,7} // 注意這裏聲明的是切片,"[]"沒有數字,go會自動分配底層數組 // 使用make動態建立切片 var s3 = make([]int, 6, 8) // 語法: make([]類型, len, cap); 能夠省略cap,此時cap = len // 經過切片建立新切片, 新切片仍然執行原數組 var s4 = s1[1,2,3] // 與從數組產生切片是類似的,不過要注意範圍
func append([]T, t …T) []T
從函數的簽名就能夠看出,做用是向切片的尾部添加元素,能夠一次添加多個值,返回新的切片,
⼀旦超出原 slice.cap 限制,就會從新分配底層數組,即使原數組並未填滿。ui
s5 := append(s4, 20)
func copy(dst, src []T) int
這個方法將類型爲 T 的切片從源地址 src 拷貝到目標地址 dst,覆蓋 dst 的相關元素,而且返回拷貝的元素個數。
源地址和目標地址可能會有重疊。拷貝個數是 src 和 dst 的長度最小值。指針
具體仍是得看例子code
src := []int{1,2,3,4} dst := []int{2,3,4} num := copy(dst, src) // dst=[]int{1,2,3}, num=3 src2 := []int{1,2,3} dst2 := [2,3,4,5] num2 := copy(dst2, src2) // dst2=[]int{1,2,3,5}, num2=3 src3 := []int{1,2,4} dst3 := []int{1,2,3,5} num3 := copy(dst3, src3) // dst3=[]int{1,2,4,5} num3=3
len()和map()方法分別返回切片中的元素數量 和 切片的容量
map類型是一種叫哈希表的數據結構,在python中叫字典,還稱爲關聯數組。它是一組無序鍵值對的集合。給定鍵能夠快速的定位對應的值
特色:
定義語法:
map[keyType]valueType{ key1: value1, key2: value2, ... } // eg: m := map[string]int{ "age": 10, "month": 12, "day": 7, "num": 1, // 這裏最後一行必須加上逗號,要否則,就把 "}"放在這個一行 }
還可使用 make 函數來定義一個map,有助於提高性能。由於事先申請⼀⼤塊內存,可避免後續操做時頻繁擴張。
語法:
// 這裏的 length 是map的初始容量,能夠不加,不過在添加元素時會平凡擴張,影響性能 make(map[keyType][valueType][, length])
可使用 map[key] 直接訪問對應的值
eg:
var m = map[int]string{ 1: "hello", 2: "world", 5: "你好", } // 迭代map for k := range m { fmt.Println(m[k]); } // 還能夠直接得到鍵和值 for k, v := range m { fmt.Println(k, v) }
咱們不少時候都會使用到
// 這裏使用了初始化,若是key存在, ok就是true, _接收的第一的參數就是值 // 若是key不存在,ok就是false if _, ok := m[key]; ok { //... }
刪除鍵前,還能夠先判斷鍵是否存在,若是鍵不存在會報錯
var m = map[int]string{ 1: "hello", 2: "world", 5: "你好", } delete(m, 1) // 刪除鍵爲1的鍵值對