Я играл с кусочками и нашел то, что не могу объяснить. Я создаю строку общей длины 10 (индекс колеблется от 0 до 9), а затем я создаю из нее срез, указывающий один после максимального индекса, и он не паникует. Это паникует, если я пройду больше, чем один последний индекс. Что я не понимаю, пожалуйста?

Я исследовал целочисленные срезы, а также подумал, что в строках может быть что-то странное, но оно показало то же поведение.

Вот пример: я ожидал сбой в x:= str[10:].

package main

import "fmt"

func main() {

    var str = "attribute="

    x := str[10:]
    fmt.Printf("type of x is %T\n", x)
    //fmt.Printf("x is a %T and length of x is %d\n", x, len(x))

    for k, v := range []byte(str) {
        fmt.Printf("%d, %x\n", k, v)
    }

}

Детская площадка: https://play.golang.org/p/Z-3YvTx3-s6

Выход:

type of x is string
0, 61
1, 74
2, 74
3, 72
4, 69
5, 62
6, 75
7, 74
8, 65
9, 3d
-3
Mike 14 Апр 2019 в 21:39

2 ответа

Лучший ответ

Он находится в спецификации. Допускается наличие low или high равной длине.

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

Что касается «почему это не ошибка»: вы можете визуализировать операцию нарезки как разрезание между элементами. Как это:

│   a   t   t   r   i   b   u   t   e   =    │
│ ↑   ↑   ↑   ↑   ↑   ↑   ↑   ↑   ↑   ↑   ↑  │
│ 0   1   2   3   4   5   6   7   8   9   10 │

Технически точка 10 среза все еще находится в пределах границ, но после нее нет элементов. Вот почему [10:] приводит к пустой строке (или потому, что между low и high нет элементов). Так же работает в ruby, например. Может быть, и другие языки тоже.

3
Sergio Tulentsev 14 Апр 2019 в 20:26

Из спецификации языка для выражений срезов:

Для строки, массива, указателя на массив или слайса a, первичное выражение

a[low : high]

создает подстроку или фрагмент Индексы low и high выбирают, какие элементы операнда a появляются в результате.

. . .

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

Таким образом, как низкий, так и высокий могут иметь значения 0 и len(a).

2
ifnotak 14 Апр 2019 в 19:00