看到這段代碼感覺很迷惑,請幫我解釋一下。代碼: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 關注
- 157 瀏覽
添加回答
舉報
0/150
提交
取消