制作了容量小于长度的切片
package main
import "fmt"
func main() {
type b []int
var k = make([]b, 10, 5)
fmt.Println(k[8])
}
当尝试运行时会出现以下错误。
恐慌:运行时错误:makeslice:上限超出范围
运行时.panic+0x9e /go/src/pkg/runtime/proc.c:1060
运行时.panic(0x453b00, 0x30020390) 运行时.panicstring+0x94 /go/src/pkg/runtime/runtime.c:116
运行时.panicstring(0x4afd6c, 0x40d80c) 运行时.makeslice+0x70 /go/src/pkg/runtime/slice.c:24
运行时.makeslice(0x44302c, 0xa, 0x0, 0x5, 0x0, ...) main.main+0x45 C:/GOEXCE~1/basics/DATATY~1/slice.go:8
main.main() 运行时.mainstart+0xf 386/asm.s:93
运行时.mainstart() 运行时.goexit /go/src/pkg/runtime/proc.c:178
运行时.goexit()
----- 由 ----- 创建的 goroutine
_rt0_386+0xbf 386/asm.s:80
我的问题是容量可以小于长度吗?
如果“是”那么为什么会出现这个错误?
如果“否”,那么为什么这是运行时错误,而不是编译时错误?
不,容量不能小于长度。
切片是对数组的一部分的引用。切片的容量表示该后备数组的大小。如果它的长度大于它的容量,那么它使用什么内存?
以下不变量始终适用于切片 s (除非您做了不安全的事情):
0 <= len(s) <= cap(s)
您的代码会产生运行时错误而不是编译时错误,因为无法始终静态检测到该错误。在你的情况下可能是这样,但请考虑以下代码:
package main
import (
"fmt"
"rand"
)
func main() {
k := make([]int, rand.Int(), rand.Int())
fmt.Println(k)
}
传递给 make 的值直到运行时才能知道。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)