Go语言数据结构: Array 和Slice
Go语言数据结构: Array 和Slice
Go 语言中的数组和切片(slice)都是用于存储一系列数据的集合,但它们之间有几个重要的区别。下面是它们的使用方法和区别:
数组
数组是一个有固定大小的数据集合,定义时需要指定其长度。数组的长度是数组类型的一部分,因此不能改变数组的大小。数组可以包含相同类型的数据,这些数据在内存中是连续的。
创建数组
var a [5]int // 定义一个长度为5,元素类型为int的数组
b := [3]string{"a", "b", "c"} // 定义一个长度为3,元素类型为string的数组,并初始化数组值
访问数组元素
a[0] = 1 // 给第1个元素赋值为1
x := a[2] // 获取第3个元素的值
遍历数组元素
for i, v := range a {
fmt.Printf("a[%d] = %d\n", i, v)
}
切片
切片是一个动态的数组,长度不固定,可以根据实际情况进行扩展。切片本身并不存储任何数据,它只是底层数组的引用,因此对切片的修改会影响到底层数组的内容。
创建切片
var s []int // 定义一个空的整型切片
s := []int{1, 2, 3} // 定义一个有3个元素的整型切片,并初始化数组值
访问切片元素
x := s[2] // 获取第3个元素的值
遍历切片元素
for i, v := range s {
fmt.Printf("s[%d] = %d\n", i, v)
}
切片操作
可以使用 slice 函数和操作符对切片进行操作。
- slice 函数:用于获取某个数组的一部分作为切片。
a := [5]int{1, 2, 3, 4, 5}
s := a[1:3] // 获取a数组中索引从1到3的切片(不包含3)
- 切片操作符:用于对切片进行扩展或缩小。
s := []int{1, 2, 3, 4, 5}
s = append(s, 6) // 在s切片末尾添加一个新元素6
s = s[:len(s)-1] // 删除s切片末尾的一个元素
总之,数组和切片都是存储数据集合的方式,但它们在使用方法上存在一定的差别。数组长度是固定的,而切片长度可以根据实际情况动态调整;数组不能直接进行扩展或缩小,而切片则可以通过 slice 函数和操作符进行扩展或缩小。
在使用 Go 语言中的切片(slice)时,需要注意以下几点:
- 创建切片时不要忘记 make 函数
在创建一个长度不为0的切片时,需要使用 make 函数来进行初始化。例如:
s := make([]int, 5)
- 切片是引用类型
切片是对底层数组的引用,因此修改切片会影响到原始数组。例如:
a := [3]int{1, 2, 3}
s := a[:]
s[0] = 100
fmt.Println(a) // [100 2 3]
- 切片容量可以自动扩展
切片的容量可以在底层数组没有空间存储更多元素时自动扩展。例如:
s := []int{1, 2, 3}
s = append(s, 4, 5, 6)
- 切片可以共享底层数组
如果将一个切片赋值给另一个切片,两个切片将共享同一个底层数组。因此,修改其中一个切片的值将会影响到另一个切片。例如:
a := []int{1, 2, 3, 4, 5}
s1 := a[1:3]
s2 := a[2:4]
s1[0] = 100
fmt.Println(s2) // [100 4]
- 切片可以作为参数传递
在函数调用时,切片可以作为参数传递。由于切片是引用类型,因此修改切片的值会影响到原始数组。例如:
func updateSlice(slice []int) {
slice[0] = 100
}
a := []int{1, 2, 3}
updateSlice(a)
fmt.Println(a) // [100 2 3]
总之,在使用 Go 语言中的切片时,需要注意它是一个引用类型,有自动扩展容量的特性,并且可以共享底层数组。正确地使用切片可以提高代码的可读性和效率。