如何在 Go 中创建数组数组?
问问题
562 次
2 回答
7
严格来说,以@Kevin Burke 的回答为基础
a := [][]byte{{1, 2}, {3, 4}}
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 并使用额外的间接访问。
例如,创建 100,000 个 3x3 数组的数组使用 5.03 MB 的 RAM,而创建 100,000 个 3x3 的切片使用 13.79 MB 的 RAM。
切片切片更加灵活——每行可以有不同的大小,但如果你只想要一个 2x2 矩阵,那么数组数组是一个更好的选择。
另一个区别是切片是引用类型 - 如果您将切片传递给函数,您将更改函数中的原始切片。数组不是 - 如果你将一个传递给一个函数,你将制作一个可能很慢的副本,或者可能是你想要的。如果要修改它,请传递一个指针。
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]]
一般来说,对于一维事物,切片几乎总是比数组好。然而,对于固定大小的多维,数组数组是更好的选择。
于 2013-04-27T09:05:57.000 回答
6
使用嵌套大括号:
a := [][]byte{{1, 2}, {3, 4}}
于 2013-04-27T03:36:50.283 回答