Срез не паникует по длине, но паникует при получении значения индекса равного длине - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть string, и когда я хочу получить значение с индексом i, он паникует, но когда я вырезаю из того же string, сохраняя более низкое значение индекса как длину, он не паникует.Хотели узнать, чем отличаются 1 и 2?

func main() {
    str := "a"
    fmt.Println(str[1])  // 1 this panics
    fmt.Println(str[1:]) // 2 this doesn't
}

1 Ответ

0 голосов
/ 27 февраля 2019

TLDR;В выражении индекса индекс должен быть меньше длины, а в выражении среза длина является допустимым индексом.

В выражении индекса индекс должен быть в диапазоне , иначе это паника.Индекс находится в диапазоне, если 0 <= i < length.Цитирование из спецификации:

В индексном выражении a[x] ...

Если a не карта:

  • индексx находится в диапазоне, если 0 <= x < len(a), в противном случае оно выходит за пределы диапазона

И:

Для a тип строки :

Ваша строковая переменная str хранит значение string, которое содержит один байт: 'a'.Индексирование начинается с нуля, так что отдельный байт имеет индекс 0.Его длина равна 1, поэтому элемент с индексом 1 отсутствует.

В выражении среза :

a[low : high]

Для массивов или строк индексы находятся в диапазоне, если 0 <= low <= high <= len(a),в противном случае они выходят за пределы диапазона.

В выражении среза длина является допустимым индексом.Так что в вашем случае индексация str, как str[1:], приведет к пустой строке: "":

В выражении среза a[low : high] ...

Результатимеет индексы, начинающиеся с 0 и длиной, равной high - low.

Отсутствующий индекс low по умолчанию равен нулю;отсутствующий индекс high по умолчанию равен длине нарезанного операнда.

Таким образом, str[1:] совпадает с str[1:len(str)], равным str[1:1].Результирующая строка будет иметь длину high - low = 1 - 1 = 0: пустое string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...