开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map :切片注意事项和细节(3)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9642
切片注意事项和细节(3)
内容介绍
一、切片的拷贝操作
二、切片是引用类型,遵守引用传递机制
一、切片的拷贝操作
1.切片使用 copy 内含子函数完成拷贝
举例说明:func main
(){
var a[]int=[](1,2,3,4,5)
var slice =make([]int,10)
fmt.Println(slice)
copy(slice,a)
fmt.Println(slice)
说明: copy(para1, para2): para1 和 para2 都是切片类型。
2.关于拷贝的注意事项,思考题:
下面的代码有没有错误:
var a[]int = []int {1
,
2,3
,
4,5
} //这里有一个切片a,它是1,2,3,4,5
v
ar slice= make([]int,1)
//切片长度定为1
fmt.Println(slice)
//应该输出一个[0]
copy(slice,a)
//
这里是拷贝操作,把a拷贝给 slice;a 和 slice 的元素不同也能拷贝,slice 的元素没有大也不会报错,它只会找到a的第一个元素拷贝给 slice
fmt.Println(slice) //输出为[1]
说明:上面的代码没有问题,可以运行,最后输出的结果是[1]
切片是引用类型,所以在传递时,遵守引用传递机制。看两段代码,并分析底层原理。
二、切片是引用类型,遵守引用传递机制
切片是引用类型,所以在传递时,遵守引用传递机制。看两段代码,并分析底层原理。
1.题1:
func main(){
var slice[]int
//声明了一个切片,此切片不可用,因为此切片没有空间
var arr [5]int =[..]int {1,2,3.4.5)slice= arr[
:
]
//这是有五个元素的一个整形数组
var slice2 = slice
//将slice交给slice2;也就是说slice和slice2都指向了这个数组
slice2[0]= 10
//通过slice2改变的10
fmt.Println("siice2",slice2)//?
slice2输出是多少-
[10,2,3,4,5]
fmt.Println("slice", slice)//?
slice输出是多少-
[10,2,3,4,5]
fmt.Println("arr", arr)//?
arr输出是多少-
[10,2,3,4,5]
新建一个文件夹名为 slice,再在此文件下新建一个 main.go;在原代码基础上加上以下代码:
package main
Import (
“fmt”
)
运行结果如下:
结果与分析相同
2.题2:
func test(slice int) {
//把切片传递给了一个函数,这个函数也是一个切片
slice[0] = 100
//这里修改slice[0].会改变实参)
func main(
){
var slice= []int {1,2,3,4}
//有一个slice切片
fmt.Println("slice=",slice)//
? 打印出来的结果
[1,2,3,4]
test(slice)
//调函数
fmt.Println("slice=", slice)//
这时slice输出什么内容,结果为
[100,2,3,4]
}
//因为 slice 是引用类型,test(slice)”传递出去的即是地址,也就是“test(slice)”和“var slice”(主函数slice)是同一个 slice,里面的 slice 是指向外面的 slice的,因此在里面的修改会影响到实参
运行测试结果代码如下:
package main
import (
"fmt"
)
func test(slice []int) {
slice[
0
] = 10
0
func main() {
var slice = [ ]int
{
1
,2,3,4}
fmt.Print1n("slic
e
=", slice)
//
[1,2,3,4]
test(slice)
fmt.Println( "slice=", slice)
//
[100,2
,
3
,
4]
}
运行结果如下:
运行结果与分析结果相同