В 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], компилятор будет жаловаться громко.