iT邦幫忙

2021 iThome 鐵人賽

0
Software Development

什麼都不會還敢說你是 RD 啊?畢業後的後端入職前準備系列 第 31

【Go】多維 slice / array

雖然之前有看過 slice / array 比較的文章,
但在寫 leetcode 時還是碰到點小麻煩,
不知道該怎麼初始化多維 slice。

多維 array

var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
i.e. var mat[2][3][4][5] int
有幾個 [] 就幾維,不需要自己弄 nested array。

初始化

a = [3][4]int{  
   {0, 1, 2, 3} ,   /*  initializers for row indexed by 0 */
   {4, 5, 6, 7} ,   /*  initializers for row indexed by 1 */
   {8, 9, 10, 11}   /*  initializers for row indexed by 2 */
}

多維 slice

雖然多維 slice 宣告也是依據 [] 有幾個,
但動態分配空間的 slice 在需要指定 index 來填值時,
需要先初始化才不會 out of bound。

566. Reshape the Matrix 時發現 return type 是 [][]int
如果用 input 給的 r 和 c 來初始化一個 var res [r][c]int
就會是一個 array 而不是 slice,因此噴錯。

初始化

目前我看到初始化多維 slice 最好的方法是用 make(),會自動填上 int 的初始值 0,如下:

// 先做一個 r 大小的 2d slice
// 此時雖然已經宣告這個 slice 中每個元素也是一個 slice,但還沒有 make 去保留空間,因此若要存取類似 reshapedMat[0][0] 會噴錯
reshapedMat := make([][]int,r)   
// reshapedMat 中每個元素都是大小為 c 的 slice
for i, _ := range mat {
    reshapedMat[i] = make([]int, c)
}

總結

  • 有幾維就有幾個 []
  • slice 要用 make 初始化,才能用 mat[0][0] 這種方法去存取並改值,不然就要用 append()
  • slice 跟 array 不是同個東西

Python 雖然也要初始化才不會 out of bound,但 return 時不需要顧慮什麼...
被寵壞ㄌㄋ


上一篇
【Day 30】接下來要繼續做的事 + 還沒完成的 WaitGroup 版 Merge Sort
系列文
什麼都不會還敢說你是 RD 啊?畢業後的後端入職前準備31

尚未有邦友留言

立即登入留言