切片索引超出范围但一个空间是免费的

时间:2015-04-29 10:26:02

标签: go slice

我想弄清楚切片大小调整是如何工作的,我有以下示例:

package main

import (
    "fmt"
)

func main() {

    s := []byte{'A', 'W', 'T', 'Q', 'X'}
    b := s[2:4]
    fmt.Println(s, len(s), cap(s))
    fmt.Println(string(b), len(b), cap(b))
    b[1] = 'H'
    b[2] = 'V'
    fmt.Println(string(b))

}

编译器抱怨:

panic: runtime error: index out of range

b的容量为3,为什么我不能指定

b[2] = 'V'

1 个答案:

答案 0 :(得分:3)

索引仅在0..len(b)-1范围内有效。引自spec

  

元素可以通过整数索引0len(s)-1来解决。

超出长度(但在容量范围内)的元素无法通过索引编制。如果切片reslice包含这些元素(但在容量范围内),则只能访问这些元素。