看到这段代码感觉很迷惑,请帮我解释一下。代码:package mainimport "fmt"func main() { s := make([]int, 0, 10) s1 := s[0:1] s1[0] = 1 println("-----") fmt.Println(s1, len(s1), cap(s1)) //[1] 1 10 fmt.Println(s, len(s), cap(s)) //[] 0 10 fmt.Println(s, s[0:10]) // [] [1 0 0 0 0 0 0 0 0 0]}上面的程序可以完美执行,虽然打印值不符合我的预期,我有两个问题:为什么 s1 打印值为:[1],而 s 打印值为 [] 在fmt.Println(s1, len(s1), cap(s1))andfmt.Println(s, len(s), cap(s))中。我认为 s1 值等于 s 值是 [1]。为什么 s[0:10] 可能打印 [1 0 0 0 0 0 0 0 0 0],而 s 打印 []。我认为s[0:10]是s的再分片,如果s是[],s[0:10]也是[]。
1 回答
手掌心
TA贡献1942条经验 获得超3个赞
s1
打印[1]
是因为它是长度为 1 的切片,并且在该长度内包含元素 1。它的长度为 1,因为它是s
from0
to 的一部分1
。因此,s1 := s[0:1]
s
打印值[]
,因为它是长度为 0 的切片。当长度为 0 时没有值可显示,因此括号之间没有任何内容。它的长度为 0,因为它是在make
调用中指定的。当make
用于制作切片时,第二个参数是切片的长度。s[0:10]
可能会打印[1 0 0 0 0 0 0 0 0 0]
,因为允许将现有切片重新切片为其整个底层容量,而不仅仅是长度。由于重新切片从0
到10
,它将包含 10 个值(切片的第二个边界不包含在内)。这就是您在打印输出中看到所有 10 个值的原因。作为奖励,
s[0:10]
不能是[]
因为这意味着您指定一个长度为 10 的切片并返回一个长度为 0 的切片。在 Go 中,切片的长度s[a:b]
始终为b - a
. 如果那不可能,那么程序就会崩溃。它不会给你一些其他长度的切片。请参阅语言规范中对这些规则的解释:https ://go.dev/ref/spec#Slice_expressions
- 1 回答
- 0 关注
- 133 浏览
添加回答
举报
0/150
提交
取消