我试图为空切片分配一个值,如下所示。
func main() {
var s []int
fmt.Println(s, len(s), cap(s))
s[0] = 99
}
,它引发了例外,
恐慌:运行时错误:索引超出范围
注意:我知道这样做的一种方法,通过在声明部分初始化值的值,如下所示。但是在上面的示例中,我试图在声明后分配一个值。
var s []int{99}
有没有办法实现这一目标?
不能仅分配空切片。您的打印声明显示,切片的长度和容量为0。在[0]
处索引肯定不超出范围。
您有(至少(三个选择:
- 附加到切片:
s = append(s, 99)
- 或初始化切片是非空的:
s := make([]int, 1)
- 或用所需的元素初始化切片:
s := []int{99}
您可以在Go Tour中找到有关切片的教程,或者有关切片使用和内部内容的更多详细信息。
var s []int{99}
上述有效
s := make([]int, 10)
s[0] = 10
fmt.Println(s)
这将初始化切片并将长度设置为10及其元素为零值
注意:执行s[10]
或任何更大的索引会惊慌,因为切片是用长度10的初始化。如果要动态增加切片大小,则使用append
您可以使用附录函数来做到这一点。
func main() {
var s []int
s = append(s,99)
fmt.Println(s) // [99]
}
https://play.golang.org/p/xatvso2ob6f
// 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
将为您提供默认值(2(的默认值。但是,对于性能,最好只分配记忆一次(如果您知道要添加多少个元素到切片(