为什么这样的slice赋值会报错

为什么这样的代码会报错?

mySlice := make([]int, 100)
mySlice[3:5] = []int{3, 4}
已邀请:

EasyHacking - 微博/公众号 搜: EasyHacking

赞同来自: astaxie haoc7 lichao2018

https://golang.org/ref/spec#Assignments

参考 go spec : “Each left-hand side operand must be addressable”, mySlice[3:5] 应该不满足这个条件

h12 - https://h12.io/about

赞同来自: Hawken haoc7

准确的说,不能赋值的原因是因为:mySlice[3:5]不是variable,所以不符合 asignability 条件。 http://golang.org/ref/spec#Assignability 所谓赋值,在Go里仅指对变量的赋值。所以非变量都是不可赋值的。

另外注意到,因为可以 &mySlice[3:5] 做取地址操作,所以可以认为slice expression其实是addressable的。

kyle

赞同来自:

mySlice[3:5]这个不能作为左值被赋值吧,新生成的切片没有接受者

h12 - https://h12.io/about

赞同来自:

应该这样写(注意3:5是两个元素,不是3个):

package main

import (
    "fmt"
)

func main() {
    mySlice := make([]int, 100)
    copy(mySlice[3:5], []int{3, 4})
    fmt.Println(mySlice[3:5])
}

jinheking

赞同来自:

mySlice := make([]int, 100)
    copy(mySlice[3:6], []int{3, 4, 5, 6})
    fmt.Println(mySlice[3:6])

我测试了一下,slice的[begin:end],相当于从begin到end-1

类似于for i=0;i<end;i++

haoc7 - http://cuihao.fun

赞同来自:

slice[a:b]包含的元素是b-a

要回复问题请先登录注册