总结了go语言中切片slice的特殊性和使用时的注意事项。git
我的理解,不足之处欢迎指出。github
slice:切片,是go语言中一种经常使用的数据结构,基于数组构建,表示相同数据类型的集合。数组
Go中数组类型表示固定长度的相同类型的数据的集合,数据在内存中连续存储,能够经过下标索引,可是又有特殊的地方:bash
因此Go语言中使用数组传递数据效率很低,一般使用切片。markdown
切片是一个数组片断的描述,包含了指向数组片断的指针,片断的长度len和容量cap(数组片断的最大长度),可是切片自己并非真正的指针类型。数据结构
切片做函数参数传递或浅拷贝时,之因此改变一个切片的数据会影响另外一个切片,是由于两个切片中中包含了指向同一数组片断的指针。app
一切看似正常?可是当一个切片发生扩容时,会将当前切片内的数据复制到另外一片内存区域,该切片的数组片断的地址发生改变,因此当切片扩容时修改一个切片的数据时不会再影响到另外一个切片!此时只能经过传递切片自己的地址来解决。函数
扩容时出错的代码以下:oop
package main import "fmt" func testSlice(slice []int) { slice = append(slice, 6, 7, 8, 9, 10) fmt.Println("testSlice:",slice) } func main() { slice := []int{1, 2, 3, 4, 5} testSlice(slice) fmt.Println("main:",slice) } 复制代码
因此,切片不是指针类型,切片数据类型是包含指向一个数组片断的指针,和当前数组片断的长度,以及当前数组最大容量的一种复合数据结构。学习
想深刻了解Go中slice数据类型的底层实现,能够参考本人的Github中学习go