亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號