Like Share Discussion Bookmark Smile

J.J. Huang   2025-02-17   Getting Started Golang 02.資料結構   瀏覽次數:次   DMCA.com Protection Status

Go | 初步了解「多維切片」

💬 簡介

在程式設計中,切片是一種非常常用的資料結構,它比陣列更加靈活。在 Go 語言中,切片可以視為對陣列的一層封裝,可以更靈活地處理動態大小的資料。當需要處理更複雜的資料結構時,多維切片是一個強大的工具。

本文將介紹多維切片,並展示如何在程式中進行有效的操作。

圖片來源:Gophers(地鼠造型的原創者為 Renee French)


✨ 多維切片的基本概念

多維切片是一種包含多個切片的切片。也就是說,它是一個切片的切片。多維切片在處理表格資料、矩陣等複雜資料結構時非常有用。它的結構可以理解為一個切片,每個元素本身也是一個切片。

1️⃣ 宣告與初始化多維切片

與一維切片類似,多維切片也是通過 [] 來宣告。宣告一個多維切片時,可以指定其內部的切片元素。

  • 範例:宣告和初始化多維切片
    1
    2
    3
    4
    var 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
    2
    fmt.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
    12
    package 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
    15
    package 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
    14
    package 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
    18
    package 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
    17
    package 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