先用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不同,尚未分配的切片也是可以用的:
一個(gè)nil切片的長度和容量都是0;你可以append到一個(gè)空切片,Go會(huì)自動(dòng)分配;你也可以直接迭代一個(gè)空切片
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é)果就是,如果一個(gè)map的值是slice類型,那么沒必要為一個(gè)新的key創(chuàng)建一個(gè)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)
}
對一個(gè)切片進(jìn)行重新切片,會(huì)分享同一個(gè)底層數(shù)組
一個(gè)切片就是一個(gè)指向數(shù)組的指針。重新切片(如 s2 := s1[a:b] )就是對相同的底層數(shù)組創(chuàng)建了一個(gè)新的指針,新的指針具有不同的起始偏移量和切片長度。
![](/d/20211017/9ba012793294740aec8eac080cb2a837.gif)
結(jié)果就是,append操作會(huì)修改所有切片。
s1 := []int64{1, 2, 3}
s2 := s1[:1]
s2 = append(s2,0)
fmt.Println(s1) // []int64{1, 0, 3}
……除非需要分配一個(gè)新數(shù)組:
s1 := []int64{1, 2, 3}
s2 := s1[:1]
s2 = append(s2,0,0,0) // 重新分配了一個(gè)新的底層數(shù)組
fmt.Println(s1) // []int64{1, 2, 3}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- go語言求任意類型切片的長度操作
- 如何在Go中使用切片容量和長度
- Go語言切片前或中間插入項(xiàng)與內(nèi)置copy()函數(shù)詳解
- golang中切片copy復(fù)制和等號(hào)復(fù)制的區(qū)別介紹
- go語言中切片與內(nèi)存復(fù)制 memcpy 的實(shí)現(xiàn)操作
- go語言中切片的長度和容量的區(qū)別