uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel

Почему можно foo[len(foo):]?

foo := [5]int{0, 1, 2, 3, 4}
fmt.Println(foo[:5]) //так можно
fmt.Println(foo[5:]) //и так
fmt.Println(foo[5])  //так нет. Почему?
//Где это документировано? Как это понимать

https://play.golang.org/p/J55-p3hW_tB
  • Вопрос задан
  • 195 просмотров
Решения вопроса 1
axifive
@axifive
Software Engineer
Потому что foo[5] это обращение к несущесвующему 5 элементу в массиве. Адресация начинается с 0 индекса и элемент с индексом 4 в нем последний.

Первая граница включается в срез последняя не включается, поэтому и пишем foo[:5]
fmt.Println(foo[5:]) //и так — это пустой срез, можно еще так его получить: fmt.Println(foo[:0])
или так: fmt.Println(foo[1:1])
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@iveronanomi
Вы ошибаетесь, по поводу отсутствия документации на эту тему
https://golang.org/ref/spec#Slice_expressions

For convenience, any of the indices may be omitted. A missing low index defaults to zero; a missing high index defaults to the length of the sliced operand:


a[2:]  // same as a[2 : len(a)]
a[:3]  // same as a[0 : 3]
a[:]   // same as a[0 : len(a)]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы