Go 语言的切片

阿里云教程3个月前发布
20 0 0

在 Go 语言中,切片和数组很像。但数组长度是固定的,是死的,切片长度像如意金箍棒一样,可随你心意随意变化大小。

Go 语言的切片

数组和切片声明时,差别仅在于方括号中。数组的方括号中有数字,切片的方括号是空的。

Go 语言的切片

如果想查看一个变量的类型,可以在 fmt.Printf() 中使用 %T 占位符:

Go 语言的切片

使用内置函数 len() 可以获取切片的长度。一个未初始化的切片,它的长度是 0,它的值等于空值 nil。

Go 语言的切片

使用内置函数 make() 可以创建指定长度的切片。make() 函数的第一个参数是切片类型,第二个参数是切片长度(length)。

Go 语言的切片

make() 函数的第三个参数是可选的,它可以指定切片的容量(capacity)。如果不指定,它的默认值就等于切片长度。使用 cap() 内置函数可以获取切片的容量。

Go 语言的切片

由于切片的长度可以动态增加,当长度超过它的容量时,会触发自动扩容。即,Go 运行时会申请一块新的更大的内存空间,把切片的原始数据拷贝过去。自动扩容的过程就像小公司的搬家。刚开始创业,人员少,场地小。后来人越来越多,装不下了,寻找更大的办公场所,再让人员搬家过去。

向切片尾部添加元素,使用 append() 函数。append() 函数的第一个参数是切片变量,后面的元素是向切片增加的元素。元素数量不定,可以有一个或多个。

Go 语言的切片

从上面例子可以看出,append() 函数不改变入参切片,而是产生新的切片变量。如果你想改变原始切片,只需将返回值重新赋予它本身,即可。

Go 语言的切片

切片和数组还有一个根本性的差异。数组是值类型,而切片是引用类型。数组是值类型,意味着,当数组用于赋值时,会进行内存数据的拷贝,两个变量会占据不同的内存空间。修改一个值,不会影响另一个值。

Go 语言的切片

切片是引用类型,意味着,两个有赋值关系的切片,它们会指向同一块内存区域,本质上是同一个值。修改一个值,会影响另一个值。

Go 语言的切片

赋值操作在代码中无处不在,最常用的地方就是调用函数时,参数传递过程,就是一个赋值过程。因此,在函数体内修改切片内容,会影响函数外部的原始切片变量。

Go 语言的切片

数组与此不同,函数内外的参数是两个完全不同的变量。改变了函数体内的数组,函数体外的数组不受任何影响。

Go 语言的切片

如果你学过 C,你会知道 C 语言的数组是引用类型,它指向数组的第一个元素。不要和 Go 的数组混淆,Go 的数组和 C 的数组类型不一样,它不是引用类型,它不是指针,它就是值。

如果你有一个数组变量,可以使用 [start:end] 切片语法,从数组中切出一条切片。

Go 语言的切片

此时的切片和数组有关联关系,它们执行同一块内存空间。更改其中一个变量,另一个变量也会同步更新内容。

Go 语言的切片

使用 copy() 内置函数可以拷贝一个切片到另一个切片。涉及的两个切片内存空间不同,改变一个,不影响另外一个。由于 copy() 不是简单的赋值,它是一种数据的克隆,比赋值操作更重。

Go 语言的切片

参考链接

  • https://go.dev/blog/slices-intro
  • https://gobyexample.com/slices
© 版权声明

相关文章

暂无评论

none
暂无评论...