Go | 初步了解「多維切片」
💬 簡介
在程式設計中,切片是一種非常常用的資料結構,它比陣列更加靈活。在 Go 語言中,切片可以視為對陣列的一層封裝,可以更靈活地處理動態大小的資料。當需要處理更複雜的資料結構時,多維切片是一個強大的工具。
本文將介紹多維切片,並展示如何在程式中進行有效的操作。
圖片來源:Gophers(地鼠造型的原創者為 Renee French)
✨ 多維切片的基本概念
多維切片是一種包含多個切片的切片。也就是說,它是一個切片的切片。多維切片在處理表格資料、矩陣等複雜資料結構時非常有用。它的結構可以理解為一個切片,每個元素本身也是一個切片。
1️⃣ 宣告與初始化多維切片
與一維切片類似,多維切片也是通過 []
來宣告。宣告一個多維切片時,可以指定其內部的切片元素。
- 範例:宣告和初始化多維切片
1
2
3
4var matrix [][]int
matrix = append(matrix, []int{1, 2, 3})
matrix = append(matrix, []int{4, 5, 6})
matrix = append(matrix, []int{7, 8, 9})📝 這樣,我們創建了一個 3x3 的矩陣,這是一個包含三個切片的多維切片。
2️⃣ 訪問多維切片的元素
與訪問一維切片類似,你可以使用索引來訪問多維切片的元素。不過需要記住,這是兩層索引:外層切片的索引,內層切片的索引。
- 範例:訪問多維切片元素
1
2fmt.Println(matrix[0][0]) // 輸出: 1
fmt.Println(matrix[2][1]) // 輸出: 8📝 在這個範例中,我們訪問了多維切片中的特定元素,
matrix[0][0]
代表第一行第一列的元素,matrix[2][1]
代表第三行第二列的元素。
🛠️ 範例:基本多維切片操作
1️⃣ 定義並初始化多維切片
- 範例:
1
2
3
4
5
6
7
8
9
10
11
12package main
import "fmt"
func main() {
// 創建並初始化一個 2x3 的多維切片
grid := [][]string{
{"A", "B", "C"},
{"D", "E", "F"},
}
fmt.Println(grid) // 輸出: [[A B C] [D E F]]
}📝 在這個範例中,我們創建了一個 2x3 的多維切片,並且初始化了其內部的元素。
2️⃣ 變更多維切片元素
- 範例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package main
import "fmt"
func main() {
// 初始化一個 2x3 的多維切片
matrix := [][]int{
{1, 2, 3},
{4, 5, 6},
}
// 修改元素
matrix[1][2] = 10
fmt.Println(matrix) // 輸出: [[1 2 3] [4 5 10]]
}📝 在這個範例中,我們更改了第二行第三列的元素,將它從
6
改為10
。
3️⃣ 使用 append
操作擴展多維切片
- 範例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14package main
import "fmt"
func main() {
matrix := [][]int{
{1, 2, 3},
{4, 5, 6},
}
// 增加一行
matrix = append(matrix, []int{7, 8, 9})
fmt.Println(matrix) // 輸出: [[1 2 3] [4 5 6] [7 8 9]]
}📝 在這個範例中,我們使用
append
操作將一行資料添加到多維切片中。
💡 進階使用
↔️ 在多維切片中進行疊代
如果需要遍歷多維切片中的所有元素,可以使用兩層 for
迴圈,或者使用 range
來簡化。
範例:使用 for 迴圈遍歷多維切片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18package main
import "fmt"
func main() {
matrix := [][]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
for i := 0; i < len(matrix); i++ {
for j := 0; j < len(matrix[i]); j++ {
fmt.Printf("%d ", matrix[i][j])
}
fmt.Println()
}
}📝 在這個範例中,我們使用兩層
for
迴圈遍歷了多維切片中的所有元素,並將它們一行一行地輸出。範例:使用 range 來遍歷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package main
import "fmt"
func main() {
matrix := [][]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
for i, row := range matrix {
for j, value := range row {
fmt.Printf("matrix[%d][%d] = %d\n", i, j, value)
}
}
}📝 在這個範例中,我們使用
range
遍歷多維切片,這樣可以更加簡潔地訪問每一行和每一列的元素。
🚀 多維切片的優化與限制
⚠️ 限制
- 記憶體佔用:由於每一層切片都包含一個指向內部資料的指標,因此多維切片的記憶體佔用相對較大。
- 元素大小不均:不同的內部切片可以擁有不同的長度,這使得多維切片在結構上非常靈活,但也可能導致處理上的不確定性。
🚀 優化
- 避免過度嵌套:多維切片可以有任意深度,但過度嵌套會增加程式複雜度,因此在設計時應該注意結構簡潔。
- 優化記憶體分配:使用切片的時候,可以預先分配足夠的容量來避免頻繁的記憶體重分配,這樣能提高效能。
🎯總結
多維切片是一個強大的工具,適用於處理矩陣、表格資料或其他複雜的資料結構。理解其基本操作和特性能幫助你更靈活地管理和處理多維資料。
最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。
註:以上參考了
Go
Go-Slice types