为什么 read on slice out of range 不会 panic? [重复]

问题描述 投票:0回答:0

在这个例子中

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]
}
  1. 执行

    fmt.Println(buf[:3][:5])
    时,
    fmt.Println(aa[:5])
    我应该收到
    slice bounds out of range
    错误。

  2. 我猜在做

    bb = buf[:3]
    时也复制了切片的上限,但是
    [9 9]
    的值是如何复制的?

  3. 有什么办法可以将

    buf
    复制到长度为3且上限为3的新变量中吗?

go slice bounds
© www.soinside.com 2019 - 2024. All rights reserved.