如何在声明之后为空切片分配一个值



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

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

使用CC_7

您可以使用附录函数来做到这一点。

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(的默认值。但是,对于性能,最好只分配记忆一次(如果您知道要添加多少个元素到切片(

相关内容

最新更新