Почему это работает, я нарезаю 1 мимо максимального индекса и не получаю ошибку? - PullRequest
0 голосов
/ 14 апреля 2019

Я играл с кусочками и нашел то, что не могу объяснить. Я создаю строку общей длины 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

Ответы [ 2 ]

3 голосов
/ 14 апреля 2019

Это в спецификации .Допускается иметь 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, например.Может быть, и другие языки.

2 голосов
/ 14 апреля 2019

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

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

a[low : high]

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

.,.

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

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

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