我正在尝试为空切片分配一个值,如下所示。
func main() {
var s []int
fmt.Println(s, len(s), cap(s))
s[0] = 99
}
它会引发异常,
恐慌:运行时错误:索引超出范围
注意: 我知道通过在声明部分初始化值如下所述的一种方法。但在上面的例子中,我试图在声明之后分配一个值。
var s []int{99}
有没有办法实现这个目标?
答案 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]
}
答案 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)。但是对于性能而言,最好只分配一次内存(如果知道要将多少元素添加到切片中)