本文由go语言教程栏目给大家分享go中关于Slice的使用注意事项,希望对需要的朋友有所帮助!
这篇文章跟大家探讨一下slice在Go中的使用,一起看看下面这段程序
package mainimport ( "fmt" )func main() { var array [10]int var slice = array[5:6] fmt.Println("lenth of slice: ", len(slice)) fmt.Println("capacity of slice: ", cap(slice)) fmt.Println(&slice[0] == &array[5])}
- 这段程序我想说的是:main函数中定义了一个10个长度的整型数组array,然后定义了一个切片slice,切取数组的第6个元 素,最后打印slice的长度和容量,判断切片的第一个元素和数组的第6个元素地址是否相等。
- 大家想想切片的第一个元素和数组的第6个元素相等吗,或许可以跑跑这段程序证明一下在往下面看结果,好了我也不卖关子啦,上面程序中slice跟据数组array创建,与数组共享存储空间,slice起始位置是array[5],长度为1,容量为5, slice[0]和array[5]地址相同。
接下来大家看看这段程序,试着自己跑一下程序,动手实践是最好的老师
package mainimport ( "fmt")func AddElement(slice []int, e int) []int { return append(slice, e) }func main() { var slice []int slice = append(slice, 1, 2, 3) newSlice := AddElement(slice, 4) fmt.Println(&slice[0] == &newSlice[0])}
- 上面这段我想表达的是函数AddElement()接受一个切片和一个元素,把元素append进切片中,并返回切片。main()函数中定 义一个切片,并向切片中append 3个元素,接着调用AddElement()继续向切片append进第4个元素同时定义一个 新的切片newSlice。最后判断新切片newSlice与旧切片slice是否共用一块存储空间
- 这段程序相信很多小伙伴都觉得append会有可能触发旧Slice的扩容,又不敢特别肯定吧,接着往下看”有可能”变为”肯定”啦:
1.append函数执行时会判断切片容量是否能够存放新增元素,如果不能,则会重新申请存储空间,新存储空间将是原来的2倍或1.25倍(取决于扩展原空间大小),本例中实际执行了两次append操作,第一次空间增长到4,所以第二次append不会再扩容,所以新旧两个切片将共用一块存储空间。程序会输出”true”。
接着往下继续看这段程序会怎样输出,可以思考一下或者跑跑程序:
package mainimport ( "fmt")func main() { orderLen := 5 order := make([]uint16, 2 * orderLen) pollorder := order[:orderLen:orderLen] lockorder := order[orderLen:][:orderLen:orderLen] fmt.Println("len(pollorder) = ", len(pollorder)) fmt.Println("cap(pollorder) = ", cap(pollorder)) fmt.Println("len(lockorder) = ", len(lockorder)) fmt.Println("cap(lockorder) = ", cap(lockorder))}
跑完上面的程序后带着疑问接着往下看会更好,整个人有一种豁然开朗的感觉,不信可以试试:
- 程序中定义一个长度为10的切片order,pollorder和lockorder分别是对order切片做了order[start,stop,max]操作生成的切片,最后程序分别打印pollorder和lockorder的容量和长度。
- order[start,stop,max]的意思是对order进行切片,新切片范围是[start, stop),新切片容量是max。order长度为2倍的orderLen,pollorder切片指的是order的前半部分切片,lockorder指的是order的后半部分切片,即原order分成了两段。所以,pollorder和lockerorder的长度和容量都是orderLen,即5。
这篇文章对Slice的一些使用讲解就在这里了,希望帮到有需要的伙伴吧,更多关于Slice的使用欢迎留言告知探讨
以上就是分享go中关于Slice的使用注意事项的详细内容,更多请关注亿码酷站其它相关文章!
<!––>分享go中关于Slice的使用注意事项
—–文章转载自PHP中文网如有侵权请联系ymkuzhan@126.com删除
转载请注明来源:分享go中关于Slice的使用注意事项
本文永久链接地址:https://www.ymkuzhan.com/45883.html
本文永久链接地址:https://www.ymkuzhan.com/45883.html
下载声明:
本站资源如无特殊说明默认解压密码为www.ymkuzhan.com建议使用WinRAR解压; 本站资源来源于用户分享、互换、购买以及网络收集等渠道,本站不提供任何技术服务及有偿服务,资源仅提供给大家学习研究请勿作它用。 赞助本站仅为维持服务器日常运行并非购买程序及源码费用因此不提供任何技术支持,如果你喜欢该程序,请购买正版! 版权声明:
下载本站资源学习研究的默认同意本站【版权声明】若本站提供的资源侵犯到你的权益,请提交版权证明文件至邮箱ymkuzhan#126.com(将#替换为@)站长将会在三个工作日内为您删除。 免责声明:
您好,本站所有资源(包括但不限于:源码、素材、工具、字体、图像、模板等)均为用户分享、互换、购买以及网络收集而来,并未取得原始权利人授权,因此禁止一切商用行为,仅可用于个人研究学习使用。请务必于下载后24小时内彻底删除,一切因下载人使用所引起的法律相关责任,包括但不限于:侵权,索赔,法律责任,刑事责任等相关责任,全部由下载人/使用人,全部承担。以上说明,一经发布视为您已全部阅读,理解、同意以上内容,如对以上内容持有异议,请勿下载,谢谢配合!支持正版,人人有责,如不慎对您的合法权益构成侵犯,请联系我们对相应内容进行删除,谢谢!