今天小编给大家分享一下Golang中Slice切片如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。你觉得会输出什么?思考一下再往下看。有的人觉得可能是[] 0 10
[10 20 30] 3 10
[] 0 10
[] 0 10
[] 0 10实际结果是[] 0 10
[10 20 30] 0 10
[] 0 10
[10 20 30 0 0 0 0 0 0 0] 0 10
[] 0 10是不是差别很大?这里的差别主要是第四行、第五行的结果。第一行:比较好理解,切片没有做任何修改,值应该是:[] 0 10第二行:也很好理解,在appendFunc函数中打印sl,免费云主机域名结果是:[10 20 30] 3 10 第三行:由于go都是值传递,所以传到appendFunc函数中的sl其实是切片复制了一份,对原sl没有影响,所以输出结果是:[] 0 10第四行:sl[:10]这个应该会报数组越界错误才对?怎么没有报错,而且还输出了10 20 30,但是len(sl)等于0,很奇怪第五行:如果第四行能输出整个数组的内容,这里的sl[:]应该也能输出内容,但是为什么是空的?这里有2个问题:为什么sl[0:10]能输出10个元素,并且打印出了函数中添加的元素?但是len(sl)等于0为什么sl[:]输出空数组?大家都知道,slice(切片)的底层实现,slice 底层存储的数据结构指向了一个 array(数组),如下图:slice结构体定义如下Data:指向具体的底层数组。Len:代表切片的长度。Cap:代表切片的容量。核心要记住的是:slice 真正存储数据的地方,是一个数组。slice 的结构中存储的是指向所引用的数组指针地址。看到这里你应该明白了,传入到appendFunc函数的sl虽然是外层定义的sl的一个值拷贝,它的修改不会影响原sl的内容,但是由于Data是个指针,appendFunc函数对Data的修改自然就影响了原sl的Data,这个很好理解。要记住一个关键点:如果传过去的值是指向内存空间的地址,是可以对这块内存空间做修改的对于第一个问题:为什么sl[0:10]能输出10个元素?这里跟切片访问的一个优化有关,当用s[low:high]访问切片的时候,表达式s[low : high]
中的 high,最大的取值范围对应着切片的容量(cap),不是单纯的长度(len) 。因此调用fmt.Println(sl[:10])
时可以输出容量范围内的值,不会出现越界。相对的 fmt.Println(sl)
, fmt.Println(sl[:])
因为该切片 len 值为 0,没有指定最大索引值,high 则取 len 值,导致输出结果为空。以上就是“Golang中Slice切片如何使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道。
本篇内容主要讲解“Android中的Scroller怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android中的Scroller怎么使用”吧!Android里Scroller类是为了实现View平滑滚动…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。