为了账号安全,请及时绑定邮箱和手机立即绑定

golang 制作 0 长度切片和重新切片切片不符合预期

golang 制作 0 长度切片和重新切片切片不符合预期

Go
明月笑刀无情 2023-01-03 13:49:01
看到这段代码感觉很迷惑,请帮我解释一下。代码: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,因为它是sfrom 0to 的一部分1。因此,s1 := s[0:1]

  • s打印值[],因为它是长度为 0 的切片。当长度为 0 时没有值可显示,因此括号之间没有任何内容。它的长度为 0,因为它是在make调用中指定的。当make用于制作切片时,第二个参数是切片的长度。

  • s[0:10]可能会打印[1 0 0 0 0 0 0 0 0 0],因为允许将现有切片重新切片为其整个底层容量,而不仅仅是长度。由于重新切片从010,它将包含 10 个值(切片的第二个边界不包含在内)。这就是您在打印输出中看到所有 10 个值的原因。

  • 作为奖励,s[0:10]不能是[]因为这意味着您指定一个长度为 10 的切片并返回一个长度为 0 的切片。在 Go 中,切片的长度s[a:b]始终为b - a. 如果那不可能,那么程序就会崩溃。它不会给你一些其他长度的切片。请参阅语言规范中对这些规则的解释:https ://go.dev/ref/spec#Slice_expressions


查看完整回答
反对 回复 2023-01-03
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信