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)时,需要注意以下几点:

  1. 创建切片时不要忘记 make 函数

在创建一个长度不为0的切片时,需要使用 make 函数来进行初始化。例如:

s := make([]int, 5)
  1. 切片是引用类型

切片是对底层数组的引用,因此修改切片会影响到原始数组。例如:

a := [3]int{1, 2, 3}
s := a[:]
s[0] = 100
fmt.Println(a)  // [100 2 3]
  1. 切片容量可以自动扩展

切片的容量可以在底层数组没有空间存储更多元素时自动扩展。例如:

s := []int{1, 2, 3}
s = append(s, 4, 5, 6)
  1. 切片可以共享底层数组

如果将一个切片赋值给另一个切片,两个切片将共享同一个底层数组。因此,修改其中一个切片的值将会影响到另一个切片。例如:

a := []int{1, 2, 3, 4, 5}
s1 := a[1:3]
s2 := a[2:4]
s1[0] = 100
fmt.Println(s2)  // [100 4]
  1. 切片可以作为参数传递

在函数调用时,切片可以作为参数传递。由于切片是引用类型,因此修改切片的值会影响到原始数组。例如:

func updateSlice(slice []int) {
    slice[0] = 100
}

a := []int{1, 2, 3}
updateSlice(a)
fmt.Println(a)  // [100 2 3]

总之,在使用 Go 语言中的切片时,需要注意它是一个引用类型,有自动扩展容量的特性,并且可以共享底层数组。正确地使用切片可以提高代码的可读性和效率。

如有疑问关注公众号给我留言
wx

关注公众号领取Go学习资料

wx

洋葱小店

©2017-2023 鲁ICP备17023316号-1 Powered by Hugo