Индекс среза странный край случай - PullRequest
0 голосов
/ 15 марта 2020

В Go индексы срезов используют полуоткрытый диапазон. Для [low: high] срез включает в себя [low], но исключает [high]. Ссылка: https://tour.golang.org/moretypes/7. Еще один способ думать об этом - это переход от [low] к [high-1] включительно.

Но взгляните на этот код. Вы можете запустить его по адресу: https://play.golang.com/p/DSLs7V8gom0

func main() {
    t := []int{5}
    fmt.Println(t)
    fmt.Println(t[0:0])
    fmt.Println(t[1:1])
}

Если вы запустили код, вы увидите, что оба t [0: 0] и t [1: 1] действительны и разрешено.

t [0: 0] означает, что включает в себя t [0] (который существует), но останавливается перед t [0] (который является t [-1], который не существует).

t [1: 1] означает, что включает в себя t [1] (который не существует), но останавливается перед t [1] (который является t [0], который существует).

В обоих случаях один из индексов относится к чему-то, что не существует, то есть индекс находится вне диапазона ==>, но синтаксически совершенен и разрешен в Golang !!

Тем не менее, если вы попробуйте любой другой индекс, например t [2], компилятор будет жаловаться громко.

1 Ответ

1 голос
/ 15 марта 2020

Вы должны думать о диапазоне, который начинается с нижнего значения и останавливается при достижении верхнего значения. Верхний никогда не может быть меньше нижнего, но он может быть любым действительным индексом или последним после конца - ie 0 или 1 в вашем примере.

Так что t[0:0] означает начало, затем остановку немедленно, давая диапазон нулевой длины. Например:

t[0:0] и t[1:1] - допустимые срезы нулевой длины

t[0:1] - срезы длиной 1

t[2:2] и t[1:0] недопустимы

Я подробно объясняю преимущества полуоткрытых диапазонов и не делаю ноль в специальном случае в моем блоге - например, см. http://devmethodologies.blogspot.com/2012/12/asymmetric-bounds-and-zero-based.html

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