目录
1、存储方式
2、声明与初始化
2.1 声明语法
2.2 数组类型
2.3 数组默认值
2.4 声明并初始化
3、访问与修改
4、指针数组
5、数组拷贝
6、数组遍历
7、多维数组
8、数组作为函数参数
PythonJavaScriptGo
Goslice
Goslicemap
1、存储方式
Gointstring等),也可以是自定义的
indexblockblock
4int4int
array := [4]int{3, 1, 4,1 }
2、声明与初始化
2.1 声明语法
Go
var variable_name [SIZE] variable_type
5float64
var arrayf [5]float64
2.2 数组类型
int[n]TYPE[4]int[5]int
var (
a1 [4]int
a2 [5]int
)
fmt.Println(reflect.TypeOf(a1))
fmt.Println(reflect.TypeOf(a2))
2.3 数组默认值
当一个变量被声明之后, 都会立即赋予一个默认值, 数组的默认值和数组的数据类型有关
var a1 [5]int
fmt.Println(a1) // [0 0 0 0 0]
var a2 [4]string
fmt.Println(a2) // [ ]
2.4 声明并初始化
如果不想填充默认值, 可以声明时就赋值
a1 := [3]int{1, 2, 3}
fmt.Println(a1)
// 如果将元素个数指定为特殊符号...,则表示通过初始化时的给定的值个数来推断数组长度
a2 := [...]int{1, 2, 3, 4}
fmt.Println(a2)
a3 := [...]int{1, 1, 1}
fmt.Println(a3)
// 如果声明数组时,只想给其中某几个元素初始化赋值,则使用索引号
a4 := [4]int{0: 1, 3: 5}
fmt.Println(a4)
3、访问与修改
可以通过数组的索引访问数组的值
a := [4]int{0: 1, 2: 5}
fmt.Println(a[0])
fmt.Println(a[2])
同理可通过数组的索引修改数组的值
a[0] = 10
a[3] = 20
fmt.Println(a[0])
fmt.Println(a[3])
4、指针数组
nil
int
a := [4]*int{0: new(int), 3: new(int)}
fmt.Println(a)
// [0xc00001c2a8 <nil> <nil> 0xc00001c2b0]
// 如果指针地址为空, 是会报空指针错误的, 比如
// *a[1] = 3
// panic: runtime error: invalid memory address or nil pointer dereference
*a[0] = 10
*a[3] = 20
fmt.Println(a)
fmt.Println(*a[0], *a[3])
// 为1赋值
a[1] = new(int)
*a[1] = 30
fmt.Println(a, *a[1])
5、数组拷贝
Go[n]TYPEnTYPE
修改 a2 数组元素的值,不会影响 a1 数组
例如:
a1 := [4]string{"a", "b", "c", "m"}
a2 := [4]string{"x", "y", "z", "n"}
a1 = a2
fmt.Println(a1, a2)
数组赋值给其它数组时,实际上是完整地拷贝一个数组。所以,如果数组是一个指针型的数组,那么拷贝的将是指针数组,而不会拷贝指针所指向的对象
a1 := [4]*string{new(string), new(string), new(string), new(string)}
a2 := a1
fmt.Println(a1, a2)
*a1[0] = "A"
*a1[1] = "B"
*a1[2] = "C"
*a1[3] = "D"
fmt.Println(*a1[0], *a2[0])
// A A
6、数组遍历
rangearrayindexrangeforarray
a := [4]int{1, 2, 3, 4}
for i, v := range a {
fmt.Println(i, v)
}
/*
0 1
1 2
2 3
3 4
*/
7、多维数组
可以通过组合两个一维数组的方式构成二维数组, 二维数据还是比较常用,
4(1,1) (2,2) (3,3) (4,4)
// pos := [4][2]int{{1, 1}, {2, 2}, {3, 3}, {4, 4}}
fmt.Println(pos)
// [[1 1] [2 2] [3 3] [4 4]]
// 修改第一点的坐标
pos[0] = [2]int{10, 10}
fmt.Println(pos)
// [[10 10] [2 2] [3 3] [4 4]]
8、数组作为函数参数
Go
如果数据结构体积庞大,则要完整拷贝一个数据结构副本时效率会很低 函数内部修改数据结构时,只能在函数内部生效,函数一退出就失效了,因为它修改的是副本对象
示例
func TestMain1(t *testing.T) {
payload := [4]int{1}
fmt.Printf("%p\n", &payload) // 0xc00014a040
change(payload) // 0xc00014a060
}
func change(payload [4]int) {
fmt.Printf("%p\n", &payload)
payload[0] = 10
}