在这个例子中
buf
长度是1024和buf[:3]
长度是3.
我可以访问
buf[:3][:5]
,即使它看起来像缓冲区溢出。
但是我怎么可能访问
aa[:5]
,它应该是buf[:3]
的副本?它不应该抛出slice bounds out of range
错误吗? (并且此错误仅出现在索引 > 1024 时)
package main
import "fmt"
func main() {
buf := make([]byte, 1024)
fmt.Println(len(buf)) // 1024
buf[3] = 9
buf[4] = 9
fmt.Println(len(buf[:3])) // 3
fmt.Println(cap(buf)) // 1024
fmt.Println(buf[:3]) // [0 0 0]
fmt.Println(buf[:3][:5]) // [0 0 0 9 9]
fmt.Println("\naa")
aa := buf[:3]
fmt.Println(len(aa)) // 3
fmt.Println(cap(aa)) // 1024
fmt.Println(aa) // [0 0 0]
fmt.Println(aa[:5]) // [0 0 0 9 9]
fmt.Println(aa[3:5]) // [9 9]
fmt.Println(aa[6:8]) // [0 0]
// fmt.Println(aa[5:]) // panic: runtime error: slice bounds out of range [5:3]
// fmt.Println(aa[:1025]) // panic: runtime error: slice bounds out of range [:1025] with capacity 1024
fmt.Println("\nbb")
bb := make([]byte, 3, 3)
bb = buf[:3]
fmt.Println(len(bb)) // 3
fmt.Println(cap(bb)) // 1024
fmt.Println(bb) // [0 0 0]
fmt.Println(bb[:5]) // [0 0 0 9 9]
fmt.Println(bb[3:5]) // [9 9]
fmt.Println(bb[6:8]) // [0 0]
}
执行
fmt.Println(buf[:3][:5])
时,fmt.Println(aa[:5])
我应该收到slice bounds out of range
错误。
我猜在做
bb = buf[:3]
时也复制了切片的上限,但是[9 9]
的值是如何复制的?
有什么办法可以将
buf
复制到长度为3且上限为3的新变量中吗?