切片索引超出范围,但有一个 space 可用

Slice index out of range but one space is free

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

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'

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

The elements can be addressed by integer indices 0 through len(s)-1.

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