【问题标题】:Create a multidimensional array创建多维数组
【发布时间】:2013-04-21 07:32:04
【问题描述】:

如何在 Go 中创建数组数组?

【问题讨论】:

    标签: go


    【解决方案1】:

    严格来说,以@Kevin Burke 的回答为基础

    a := [][]byte{{1, 2}, {3, 4}}
    

    是一个slice 的切片。这在内部与 array 的数组完全不同。

    Playground link

    fmt.Println("Array of Arrays")
    a := [2][2]int{{0, 1}, {2, 3}}
    for i := 0; i < 2; i++ {
        for j := 0; j < 2; j++ {
            fmt.Printf("a[%d][%d] = %d at %p\n", i, j, a[i][j], &a[i][j])
        }
    }
    
    fmt.Println("Slice of Slices")
    b := [][]int{{0, 1}, {2, 3}}
    for i := 0; i < 2; i++ {
        for j := 0; j < 2; j++ {
            fmt.Printf("b[%d][%d] = %d at %p\n", i, j, b[i][j], &b[i][j])
        }
    }
    

    在内部,数组数组只是一块连续的内存,因此效率很高,而切片切片则更复杂。每个子切片可以有不同的大小并分配在不同的位置。切片头占用额外的 RAM 并使用额外的间接访问。

    例如,creating 100,000 3x3 array of arrays 使用了 5.03 MB 的 RAM,而 creating 100,000 3x3 slices of slices 使用了 13.79 MB 的 RAM。

    切片切片更加灵活 - 每行可以有不同的大小,但如果您只想要一个 2x2 矩阵,那么数组数组是更好的选择。

    另一个区别是切片是引用类型 - 如果您将切片传递给函数,您将更改函数中的原始切片。数组不是 - 如果你将一个传递给一个函数,你将制作一个可能很慢的副本,或者可能是你想要的。如果你想修改它然后传递一个指针。

    Here is an example

    func f1(a [2][2]int) {
        fmt.Println("I'm a function modifying an array of arrays argument")
        a[0][0] = 100
    }
    
    func f2(b [][]int) {
        fmt.Println("I'm a function modifying an slice of slices argument")
        b[0][0] = 100
    }
    
    func main() {
        fmt.Println("Array of arrays")
        a := [2][2]int{{0, 1}, {2, 3}}
        fmt.Printf("Before %v\n", a)
        f1(a)
        fmt.Printf("After %v\n\n", a)
    
        fmt.Println("Slice of slices")
        b := [][]int{{0, 1}, {2, 3}}
        fmt.Printf("Before %v\n", b)
        f2(b)
        fmt.Printf("After %v\n", b)
    }
    

    打印出来的

    Array of arrays
    Before [[0 1] [2 3]]
    I'm a function modifying an array of arrays argument
    After [[0 1] [2 3]]
    
    Slice of slices
    Before [[0 1] [2 3]]
    I'm a function modifying an slice of slices argument
    After [[100 1] [2 3]]
    

    一般来说,对于一维事物,切片几乎总是比数组好。但是对于固定大小的多维,数组数组是更好的选择。

    【讨论】:

      【解决方案2】:

      使用嵌套大括号:

      a := [][]byte{{1, 2}, {3, 4}}
      

      【讨论】:

        猜你喜欢
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 2014-11-03
        • 2014-03-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多