【问题标题】:How to assign a value to the empty slice after the declaration声明后如何为空切片赋值
【发布时间】:2018-02-09 07:41:14
【问题描述】:

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

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

它会抛出一个异常,

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

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

var s []int{99}

有没有办法做到这一点?

【问题讨论】:

    标签: go slice


    【解决方案1】:

    不能只分配空切片。您的打印语句显示切片的长度和容量为 0。[0] 处的索引绝对超出范围。

    你有(至少)三个选择:

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

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

    【讨论】:

    • 感谢@Marc 的指导。
    【解决方案2】:
    // 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) 为您完成初始化。但是为了性能,最好只分配一次内存(如果你知道有多少元素将被添加到切片中)

    【讨论】:

      【解决方案3】:
      var s []int{99}
      

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

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

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

      注意:执行s[10] 或任何更大的索引都会出现恐慌,因为切片的长度为 10。如果要动态增加切片大小,请使用 append

      【讨论】:

        【解决方案4】:

        你可以使用 append 函数来做到这一点。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-15
          • 2023-03-13
          • 2021-01-15
          • 1970-01-01
          • 2014-10-22
          • 2012-10-25
          相关资源
          最近更新 更多