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

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

為什么 go 允許從 len(slice) 切片?

為什么 go 允許從 len(slice) 切片?

Go
aluckdog 2021-10-04 17:27:44
為什么會出現以下行為:a := []int{1, 2, 3}fmt.Println(a[0:])fmt.Println(a[1:])fmt.Println(a[2:])fmt.Println(a[3:])// doesn't panic - why??fmt.Println(a[4:])// panics as expected
查看完整描述

3 回答

?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

引用規范:切片表達式

對于數組或字符串,如果,則索引在范圍內0 <= low <= high <= len(a),否則它們超出范圍。對于切片,索引上限是切片容量cap(a)而不是長度。

所以本說明書中允許使用指數高達len(a)底層的陣列,len(a) 包括(或cap(a)在在這種情況下具有相同的值的切片的情況下)。這就是為什么a[3:]在你的情況下不恐慌。

但它當然會產生一個空切片,因為:

a[low : high]

意味著結果的索引從 at 開始,0長度等于high - lowand 由于high被省略,它默認為len(a)so len(a) - len(a) = 0。

而且(根據規范)使用索引> len(a) 將超出范圍,因此會導致運行時恐慌:

如果索引在運行時超出范圍,則會發生運行時恐慌。


查看完整回答
反對 回復 2021-10-04
?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

a[3:] 構建一個空切片,它就像一個空數組一樣,是一個有效且有用的對象(在所有語言中,不僅僅是在 Go 中)。


空切片也仍然指向底層數組、位置和容量,有時可以擴展:


a := []int{1, 2, 3}

emptySlice := a[1:1]

fmt.Println(emptySlice) // []

notEmpty := emptySlice[0:2]

fmt.Println(notEmpty)   // [2 3]

另一方面,具有負長度的切片是不一致的。它沒有任何意義,因此被禁止。


查看完整回答
反對 回復 2021-10-04
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

因為在切片中有0元素 ( 3-3) 是完全有效的。但是有-1元素 ( 3-4) 不是。


這種行為也與其他語言一致。例如,Java:


System.out.println(Arrays.asList(1, 2, 3).subList(0, 3));

System.out.println(Arrays.asList(1, 2, 3).subList(1, 3));

System.out.println(Arrays.asList(1, 2, 3).subList(2, 3));

System.out.println(Arrays.asList(1, 2, 3).subList(3, 3));

System.out.println(Arrays.asList(1, 2, 3).subList(4, 3));

只有最后一個語句失敗。


查看完整回答
反對 回復 2021-10-04
  • 3 回答
  • 0 關注
  • 275 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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