0
任何人都知道爲什麼下面的代碼沒有出現恐慌,它訪問字符串長度上的索引。切片的起始位置大於字符串的長度
import (
"fmt"
)
func main() {
fmt.Println("hi"[2:])
}
任何人都知道爲什麼下面的代碼沒有出現恐慌,它訪問字符串長度上的索引。切片的起始位置大於字符串的長度
import (
"fmt"
)
func main() {
fmt.Println("hi"[2:])
}
它沒有「超過」長度,2正好是長度(等於它)。
對於數組或字符串,指數在範圍內如果
0 <= low <= high <= len(a)
,否則它們是超出範圍。
由於正在切片一個string
,索引在範圍,如果:
0 <= low <= high <= len(a)
該表達式:
"hi"[2:]
由於上界缺失,默認爲長度,這是2,所以它等同於:
"hi"[2:2]
這是完全有效的規範,它會導致一個空的string
。如果將其更改爲"hi"[3:]
,那麼它將超出範圍並導致編譯時錯誤(因爲可以在編譯時檢查常量string
)。
推理是上限是排他性的,例如, a[0:0]
有效並且將是0長度,a[0:1]
將有效的長度爲1,a[0:len(a)]
,長度將與a
相同。
在切片的情況下,下限甚至可以大於切片長度(但不得超過切片容量)。有關更多詳細信息,請參閱Slicing: Out of bounds error in Go。