go語言中的二維切片賦值
先用append填充一維的,然后將一維append到二維
代碼如下
var a [][]int for i := 0; i < 10; i++ { var tmp []int for j:= 0; j < 10; j++ { tmp = append(tmp, j) } a = append(a, tmp) }
補(bǔ)充:Go切片的一些技巧
空切片也是切片
與map不同,尚未分配的切片也是可以用的:
一個nil切片的長度和容量都是0;你可以append到一個空切片,Go會自動分配;你也可以直接迭代一個空切片
var s []int64 // nil, len 0, cap 0 for i := range s { fmt.Println("this will not be printed") } s = append(s, 1) // len 1
結(jié)果就是,如果一個map的值是slice類型,那么沒必要為一個新的key創(chuàng)建一個slice。
m := map[string][]int64{} for { // do something if _, found := m[key]; !found { m[key] = []int64{value} } else { m[key] = append(m[key], value) } }
上面的代碼可以替換為
m := map[string][]int64{} for { // do something m[key] = append(m[key], value) }
對一個切片進(jìn)行重新切片,會分享同一個底層數(shù)組
一個切片就是一個指向數(shù)組的指針。重新切片(如 s2 := s1[a:b] )就是對相同的底層數(shù)組創(chuàng)建了一個新的指針,新的指針具有不同的起始偏移量和切片長度。
結(jié)果就是,append操作會修改所有切片。
s1 := []int64{1, 2, 3} s2 := s1[:1] s2 = append(s2,0) fmt.Println(s1) // []int64{1, 0, 3}
……除非需要分配一個新數(shù)組:
s1 := []int64{1, 2, 3} s2 := s1[:1] s2 = append(s2,0,0,0) // 重新分配了一個新的底層數(shù)組 fmt.Println(s1) // []int64{1, 2, 3}
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Go語言函數(shù)的延遲調(diào)用(Deferred Code)詳解
本文將介紹Go語言函數(shù)和方法中的延遲調(diào)用,正如名稱一樣,這部分定義不會立即執(zhí)行,一般會在函數(shù)返回前再被調(diào)用,我們通過一些示例來了解一下延遲調(diào)用的使用場景2022-07-07