Почему пани c не происходит? - PullRequest
0 голосов
/ 15 января 2020

У меня есть следующий код:

package main

import (
    "fmt"
)

func main() {
    primes := []int{2, 3, 5, 7, 11, 13}

    for i, _ := range primes {

        s := i + 1
        fmt.Printf("%v => %v\n", s, primes[s:])

    }
}

, и он выдает следующие значения:

1 => [3 5 7 11 13]
2 => [5 7 11 13]
3 => [7 11 13]
4 => [11 13]
5 => [13]
6 => []

Вопрос в том, почему здесь не возникает pani c, он должен быть вне диапазона. Почему в индексе 6 есть пустой фрагмент? Слайс похож на список в функциональном программировании?

1 Ответ

3 голосов
/ 15 января 2020

Spe c: выражения среза:

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

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

Индекс начинается с 0..len(primes)-1, поэтому s := i+1 будет иметь len(primes) при макс.

И длина - это допустимый индекс среза. primes[s:] имеет отсутствующий индекс high, поэтому по умолчанию используется len(primes), и primes[s:len(primes)] является действительным, но это будет пустой срез, когда s == len(primes).

При нарезке, low индекс включает в себя, а high является эксклюзивным, поэтому длина является допустимым индексом: primes[:] = primes[0:len(primes)]. Для рассуждения см. Связанные вопросы: Какова идея обозначения индексов Go ломтиков? ; и в срезе Go, почему s [lo: hi] заканчивается в элементе hi-1?

...