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

Go -- Invalid operation about array or slice

Go -- Invalid operation about array or slice

慕仙森 2019-03-15 18:56:03
相关代码    //一些Array声名     //m := [...]int{7:7}[3:]     //m := [3]int{}[3:]     //m := [14]int{4}[3:0]          //m := [14]int{17:1}  error array:beyond index          //right way for dec slice     //m := []int{4:5}         m := [...]int{7:7}[3:]      执行上面的代码会产生错误:invalid operation [8]int literal[3:] (slice of unaddressable value),从其他语言来
查看完整描述

2 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

个人理解,
golang中的切片跟数组是不通的类型结构。切片时指向底层数组的可变的struct。
而数组是不可变的。你通过[...]int{7,7}这种定义的是不可变的数组,此时数组是无法像操作切片一样进行操作的。

查看完整回答
反对 回复 2019-03-15
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

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-03-15
  • 2 回答
  • 0 关注
  • 514 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信