如何在声明后为空切片赋值

时间:2018-02-09 07:41:15

标签: go slice

我正在尝试为空切片分配一个值,如下所示。

func main() {
    var s []int
    fmt.Println(s, len(s), cap(s))
    s[0] = 99
}

它会引发异常,

  

恐慌:运行时错误:索引超出范围

注意: 我知道通过在声明部分初始化值如下所述的一种方法。但在上面的例子中,我试图在声明之后分配一个值。

var s []int{99}

有没有办法实现这个目标?

4 个答案:

答案 0 :(得分:5)

不能将空切片分配给。您的print语句显示切片的长度和容量为0. [0]处的索引肯定是超出范围的。

你有(至少)三种选择:

  • 附加到切片:s = append(s, 99)
  • 或将切片初始化为非空:s := make([]int, 1)
  • 或使用您想要的元素初始化切片:s := []int{99}

您可以在Go tour中找到关于切片的教程,或者有关slice usage and internals的更多详细信息。

答案 1 :(得分:2)

您可以使用追加功能来实现。

func main() {
    var s []int
    s = append(s,99)
    fmt.Println(s)  // [99]
}

https://play.golang.org/p/XATvSo2OB6f

答案 2 :(得分:2)

var s []int{99}

上述方法有效,但如果要在声明后分配,则需要使用make函数创建一个具有足够长度的切片

s := make([]int, 10)
s[0] = 10
fmt.Println(s)

这将初始化切片并将长度设置为10,将其元素设置为零值

注意:执行s[10]或任何更大的索引会因为切片初始化为10而出现混乱。如果要动态增加切片大小,请使用append

答案 3 :(得分:1)

// slice declaration; no memory allocation
var slice []int 

//slice initialization with length (0) and capacity (10);
//memory allocated for 10 ints
slice = make([]int, 0, 10)

 // push to the slice value - than increase length
slice = append(slice, 1)

//change the value. Index has to be lower then length of slice
slice[0] = 2

在此输出中获取战利品 - https://play.golang.com/p/U426b1I5zRq

当然,您可以使用make跳过初始化,append将为您执行默认值capacity(2)。但是对于性能而言,最好只分配一次内存(如果知道要将多少元素添加到切片中)