使用Go语言创建高效的二维数组

发布时间:2023-05-18

一、创建二维数组

在Go中,二维数组可以使用多个一维数组来表示。我们可以使用以下代码来创建一个简单的二维数组:

array := [3][3]int{{1,2,3},{4,5,6},{7,8,9}}

这将创建一个包含9个元素的二维数组。 我们也可以使用for循环来创建一个动态大小的二维数组。以下是一个示例代码:

var rows, cols int = 3, 3
var arr = make([][]int, rows)
for i := 0; i < rows; i++ {
    arr[i] = make([]int, cols)
    for j := 0; j < cols; j++ {
        arr[i][j] = i + j
    }
}

此代码将创建一个3行3列的二维数组,并将每个元素设置为行索引和列索引之和。

二、遍历二维数组

我们可以使用嵌套循环来遍历二维数组:

for i := 0; i < rows; i++ {
    for j := 0; j < cols; j++ {
        fmt.Print(arr[i][j], " ")
    }
    fmt.Println()
}

此代码将打印出二维数组的所有元素。

三、使用切片创建二维数组

在Go中,我们也可以使用切片来创建二维数组。以下是一个示例代码:

slice := [][]int{{1,2},{3,4},{5,6}}

这将创建一个包含6个元素的二维切片。 我们还可以使用for循环来创建一个动态大小的二维切片:

var rows, cols int = 3, 2
slice := make([][]int, rows)
for i := range slice {
    slice[i] = make([]int, cols)
    for j := range slice[i] {
        slice[i][j] = i + j
    }
}

此代码将创建一个3行2列的二维切片,并将每个元素设置为行索引和列索引之和。

四、二维数组的性能

在Go中,二维数组的性能通常比切片要好。这是因为在二维数组中,所有的元素都是在连续的内存位置上分配的,这使得它们更容易被缓存和预取。而在切片中,每个元素都是单独分配的,它们可能不会被缓存或预取。 以下是一个简单的基准测试,比较二维数组和切片:

func BenchmarkArray(b *testing.B) {
    var arr [1000][1000]int
    for n := 0; n < b.N; n++ {
        for i := range arr {
            for j := range arr[i] {
                arr[i][j] = i + j
            }
        }
    }
}
func BenchmarkSlice(b *testing.B) {
    var slice [][]int
    for n := 0; n < b.N; n++ {
        for i := 0; i < 1000; i++ {
            row := make([]int, 1000)
            for j := range row {
                row[j] = i + j
            }
            slice = append(slice, row)
        }
    }
}

在我的机器上运行该基准测试,结果表明二维数组比切片要快得多。