为了账号安全,请及时绑定邮箱和手机立即绑定

大佬们遇到过这个问题吗?Go -- Invalid operation about array or slice求大佬指点!

大佬们遇到过这个问题吗?Go -- Invalid operation about array or slice求大佬指点!

慕的地10843 2019-08-21 11:41:50
相关代码//一些Array声名//m:=[...]int{7:7}[3:]//m:=[3]int{}[3:]//m:=[14]int{4}[3:0]//m:=[14]int{17:1}errorarray:beyondindex//rightwayfordecslice//m:=[]int{4:5}m:=[...]int{7:7}[3:]执行上面的代码会产生错误:invalidoperation[8]intliteral[3:](sliceofunaddressablevalue),从其他语言来理解这个由点曲折...你有更好的不能书写的建议吗?
查看完整描述

2 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

m:=[...]int{7:7}[3:][3:]这种操作只能作用在变量上,即已经存在内存地址的数据上,而[...]int{7:7}在赋值给变量前本身地址是不确定的,需要提前赋值给变量,之后才可以使用[3:]这样的操作。
其次这种骚操作看不到任何有意义的地方,还会造成内存浪费,[...]int{7:7}相创建8个长度的数组,而[3:]截取之后前三个元素你就没有办法再操作,严重浪费内存,导致内存泄漏。
这种写法不符合Go的设计,不仅会造成内存泄漏还会导致代码不易维护和阅读.
如果[...]int{7:7}[3:]语法正确,那么下面拆分的代码结果会是[...]int{7:7}[3:]的预期结果。
a:=[...]int{7:7}
m:=a[3:]
fmt.Println(m)
但是有个更简单的创建slice的方法,它是简洁的,且不会造成内存泄漏,m=[]int{4:7},其结果和上述代码完全一致。
Go不需要很多语法糖,建议阅读go最佳实践
                            
查看完整回答
反对 回复 2019-08-21
?
狐的传说

TA贡献1804条经验 获得超3个赞

个人理解,golang中的切片跟数组是不通的类型结构。切片时指向底层数组的可变的struct。而数组是不可变的。你通过[...]int{7,7}这种定义的是不可变的数组,此时数组是无法像操作切片一样进行操作的。
                            
查看完整回答
反对 回复 2019-08-21
  • 2 回答
  • 0 关注
  • 363 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号