学习目标:
例如:
- 学习关于数组的使用注意事项和细节
- 学习关于切片的使用注意事项和细节
- 了解string和slice的底层
学习内容:
- Go的数组属性是值类型,在默认情况下是值传递,因此会进行值拷贝
- 长度是数组类型的一部分
- 切片的内存布局分析
- 切片的两种使用方法的区别分析(面试可能会问)
- string和slice的区别
1 - 举例分析
通过分析可以看出,在test函数内和main函数内arr数组指向的地址不是同一块
即在在Go语言中只存在值传递,要么是值的副本,要么是指针的副本。无论是值类型的变量还是引用类型的变量亦或是指针类型的变量作为参数传递都会发生值拷贝,开辟新的内存空间
2- 数组作为参数传递
长度是数组类型的一部分,在作为函数参数传递时若实参和形参的数组的长度不相同会报错
3-切片的内存布局分析![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/7fc5d92f900ebb3baafdedbecf10a6d3.png)
切片是引用类型(本质上也是值传递只不过是拷贝地址),他和被切数组指向的是同一个地址
切片第一个储存的是第一个元素的地址,第二个是切片的长度,第三个是切片的容量(cap是一个内置函数,用于统计切片的容量,即切片最大可以存放多少个元素)
切片可以使用apend内置函数进行动态增长,原理是在底层创建一个新的数组把原来的元素拷贝到新数组中在引用新数组(该过程程序员是不见的)
切片的copy内置函数可以将本切片中的元素拷贝到另一个切片中,且这两个切片的数据空间
是相互独立的
4-切片的两种使用方法的区别分析
方式1是直接引用数组,这个数组是事先存在的,程序员是可见的。
方式2通过make来创建切片,make也会创建一个数组是由切片在底层维护的,程序员是看不见的
5-string和slice的区别
string底层是一个byte数组,因此string也可以进行切片处理
string是不可改变的,不能通过str[0]='z’来修改字符串
string和切片在内存中的形式: