首页后端开发其他后端知识go语言slice的用法是什么,slice使用要注意哪些

go语言slice的用法是什么,slice使用要注意哪些

时间2024-03-28 07:36:03发布访客分类其他后端知识浏览458
导读:这篇文章给大家分享的是“go语言slice的用法是什么,slice使用要注意哪些”,文中的讲解内容简单清晰,对大家认识和了解都有一定的帮助,对此感兴趣的朋友,接下来就跟随小编一起了解一下“go语言slice的用法是什么,slice使用要注意...
这篇文章给大家分享的是“go语言slice的用法是什么,slice使用要注意哪些”,文中的讲解内容简单清晰,对大家认识和了解都有一定的帮助,对此感兴趣的朋友,接下来就跟随小编一起了解一下“go语言slice的用法是什么,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))}
    

跑完上面的程序后带着疑问接着往下看会更好,整个人有一种豁然开朗的感觉,不信可以试试:

  1. 程序中定义一个长度为10的切片order,pollorder和lockorder分别是对order切片做了order[start,stop,max]操作生成的切片,最后程序分别打印pollorder和lockorder的容量和长度。
  2. order[start,stop,max]的意思是对order进行切片,新切片范围是[start, stop),新切片容量是max。order长度为2倍的orderLen,pollorder切片指的是order的前半部分切片,lockorder指的是order的后半部分切片,即原order分成了两段。所以,pollorder和lockerorder的长度和容量都是orderLen,即5。

到此这篇关于“go语言slice的用法是什么,slice使用要注意哪些”的文章就介绍到这了,感谢各位的阅读,更多相关go语言slice的用法是什么,slice使用要注意哪些内容,欢迎关注网络资讯频道,小编将为大家输出更多高质量的实用文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: go语言slice的用法是什么,slice使用要注意哪些
本文地址: https://pptw.com/jishu/654793.html
HTML中图片位置设置用什么属性,用法是什么 C++类的大小怎么算,方法是什么

游客 回复需填写必要信息