文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Golang中Slice切片如何使用

2023-07-05 07:05

关注

今天小编给大家分享一下Golang中Slice切片如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

上代码

func main() {sl := make([]int, 0, 10)var appenFunc = func(s []int) {s = append(s, 10, 20, 30)fmt.Println(s, len(sl), cap(sl))}fmt.Println(sl, len(sl), cap(sl))appenFunc(sl)fmt.Println(sl, len(sl), cap(sl))fmt.Println(sl[:10], len(sl), cap(sl))fmt.Println(sl[:], len(sl), cap(sl))}

你觉得会输出什么?思考一下再往下看。

有的人觉得可能是

[] 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个问题:

大家都知道,slice(切片)的底层实现,slice 底层存储的数据结构指向了一个 array(数组),如下图:

Golang中Slice切片如何使用

slice结构体定义如下

type SliceHeader struct {      Data uintptr      Len  int      Cap  int  }

核心要记住的是: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切片如何使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯