go切片的copy和view的使用方法
语义理解切片
go语言中的切片是go语言的一个特色,从语义上来说,切片就是把一个整体的东西切分成小的部分,那么对于语言中的切片也是同理。
举个例子看如下代码:
packagemain import"fmt" funcmain(){ arr:=[...]int{0,1,2,3,4,5,6,7} fmt.Println("arr[2:6]:",arr[2:6])//从下标2到下标6 fmt.Println("arr[:6]:",arr[:6])//从下标0到下标6 fmt.Println("arr[2:]:",arr[2:])//从下标2到最后 fmt.Println("arr[:]:",arr[:])//全部 }
输出结果为:
arr[2:6]:[2345]
arr[:6]:[012345]
arr[2:]:[234567]
arr[:]:[01234567]
这里可以很明确的看出,我们想要arr数组的哪一部分,我们就切哪一部分。
当然,如果仅仅知道切片是这么用的当然还不够,我们应该更加深入的理解,如:
对原数组的copy还是view。
对于go语言的数组,copy和view是同时都存在的。
- copy就是使用这个数组的时候我将这个数组拷贝一份,这样对于数组的增删改,是不会改变原数组的值的
- view由数组执行切片所返回的对象是一个view,即视图,若我们在视图上操作数组,会改变原数组,
copy场景
packagemain import( "fmt" ) funcupdateArr(arr[5]int){ arr[0]=100 fmt.Println("修改后的arr:",arr) } funcmain(){ arr3:=[...]int{2,4,5,6,7} fmt.Println("原来的:",arr3) updateArr(arr3) fmt.Println("再次查看原始的:",arr3) }
输出结果:
原来的:[24567]
修改后的arr:[1004567]
再次查看原始的:[24567]
如上代码可以看到,我们在updateArr里面修改了下标为0的值,但是我们输出原始数组的时候,并没有变。这就是对数组copy。
view场景
funcupdateArr(arr[]int){ arr[0]=100 fmt.Println("修改后的arr:",arr) } funcmain(){ arr3:=[...]int{2,4,5,6,7} fmt.Println("原来的:",arr3) //使用切片 updateArr(arr3[:]) fmt.Println("再次查看原始的:",arr3) }
输出结果:
原来的:[24567]
修改后的arr:[1004567]
再次查看原始的:[1004567]
为什么view能够改变原数组
虽然Slice本身是值类型,但是它内部使用了对数组的指针引用,所以修改切片数据,会将数组原有数据修改掉。
当然,在理解上面的同时,一定要知道go是如何定义一个切片的
varb[]int
所以,在updateArr这个函数传参的时候arr[]int是传切片进去。不然会报错。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。