对于 Go 切片有点疑问?

查看 63|回复 2
作者:52funny   
为什么切片的左边可以是数组的长度,按照道理来说应该越界了呀?
package main
import "fmt"
func main() {
        var s = "whaomi"
        var bs = []byte(s)
        fmt.Println(bs[len(s):])
        // error
        // fmt.Println(bs[len(s)+1:])
}
数组长度是 6 ,按照 0 下标开始最后一位应该是 5 ,但是却可以使用切片从 6 开始 bs[len(s):]
Code

fmt, len, 切片, println

nodejx   
By ChatGPT3.5:
在你的代码中,bs 是从字符串 s 创建的字节切片。当你使用 bs[len(s):] 访问超出切片有效范围的元素时,它不会导致 panic 。相反,它将返回一个空的切片,不会引发运行时错误。
因此,fmt.Println(bs[len(s):]) 这一行不会引发 panic ,它将打印一个空的字节切片 []。
但是,如果你取消注释 // fmt.Println(bs[len(s)+1:]) 这一行并尝试访问超出切片有效范围更远的元素,你会在编译时出现错误,因为你试图访问切片范围之外的元素。Go 的编译器会捕获这个错误,阻止你构建程序。
Sricor   
Go 中语法上允许 arr[len(arr):],表示从 arr 的末尾到末尾的切片,实际上返回一个空切片,且仍然与原始切片共享底层数组。
即使语法是允许的,但好像平常很少用到。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部