一、创建二维数组
在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)
}
}
}
在我的机器上运行该基准测试,结果表明二维数组比切片要快得多。