go语言中的数据是长度固定,数据类型一致的连续块,可以存储基础类型和结构类型。
这种数据结构决定了他的读写快,插入慢(通常数组的性能和线性表中的链表比较)
- 数组定义
// 一旦声明,数组存储的类型和长度都固定了,如果想变长,则必须创建一个新的数据,将当前数组复制到新数组中
// 创建了一个每个元素都是整数零值数组
var arr [5]int
arr := [5]int{1, 2, 3, 4, 5}
arr := [...]int{1, 2, 3, 4, 5}
//如果不加长度则定义的为切片
arr := []int{1, 2, 3, 4, 5}
- 数组元素访问,修改,删除
// 定义一个数组
array := [5]int{1, 2, 3 ,4, 5}
// 去除数组中的一个元素
a_2 = array[1]
// 修改数组中的一个元素
array[2] = 35
// 使用切片删除第三个元素
a = append(a[:2], a[2+1:]...)
- 数组复制
// 数组复制
只有元素个数相同,类型相同的数组才能相互复制
var arr1 = [5]int
arr2 := [...]int{1, 2, 3, 4, 5}
arr1 = arr2
- 数组遍历
for _, e := range [5]int{1, 2, 3,4, 5}{
// 通过range遍历得到的value是值拷贝。
fmt.Println(e)
}
for i, e := range [5]int{1, 2, 3,4, 5}{
// 通过range遍历得到的value是值拷贝。
fmt.Println(i, e)
}
// range函数是值拷贝,如果想修改数组元素(特别是类似结构体时,需要直接通过数组引用进行修改)
arr := [5]int{1, 2, 3,4, 5}
fmt.Println(arr)
for i, e := range arr{
// 通过range遍历得到的value是值拷贝。
if i == 2{
arr[i] = 9
fmt.Println(e)
}
}
fmt.Println(arr)
- 数组作为函数参数进行传递时为值传递,切片作为函数参数进行传递时为引用传递
// 数组作为函数参数进行传递时,总是以值的方式进行传递
// 运行结果:
// In modify(), array values: [10 2 3 4 5]
// In main(), array values: [1 2 3 4 5]
package main
import "fmt"
func modify(array [5]int) {
array[0] = 10
fmt.Println("In modify(), array values:", array)
}
func main() {
array := [5]int{1,2,3,4,5}
modify(array)
fmt.Println("In main(), array values:", array)
}
// 切片作为函数参数进行传递时,进行引用传递
// 运行结果:
// In modify(), array values: [10 2 3 4 5]
// In main(), array values: [10 2 3 4 5]
package main
import "fmt"
func modify(array []int) {
array[0] = 10
fmt.Println("In modify(), array values:", array)
}
func main() {
array := []int{1,2,3,4,5}
modify(array)
fmt.Println("In main(), array values:", array)
}