например, ссылка на массив Голангаb [1: 4] ссылки на элементы 1,2,3 - PullRequest
6 голосов
/ 03 мая 2011

Блог golang гласит:

"Срез также можно сформировать," разрезая "существующий срез или массив. Нарезка выполняется путем указания полуоткрытого диапазона с двумя индексами, разделенными двоеточием.Например, выражение b [1: 4] создает срез, включающий элементы с 1 по 3 из b (индексы полученного среза будут от 0 до 2). "

Может кто-нибудь объяснить, пожалуйста, логику ввыше.IE.Почему b [1: 4] не ссылается на элементы с 1 по 4?Это согласуется с другими ссылками на массив?

Ответы [ 4 ]

8 голосов
/ 04 мая 2011

Индексы указывают на «начало» элемента. Это используется всеми языками, использующими индексацию с нуля:

       | 0 | first | 1 | second | 2 | third | 3 | fourth | 4 | fifth | 5 |
[0]   =  ^
[0:1] =  ^ --------> ^
[1:4] =              ^-------------------------------------> ^  
[0:5] =  ^ ----------------------------------------------------------> ^

Также обычно поддерживается отрицательная индексация, хотя Go не позволяет этого:

       |-6 |       |-5 |        |-4 |       |-3 |        |-2 |       |-1 |
       | 0 | first | 1 | second | 2 | third | 3 | fourth | 4 | fifth | 5 |
4 голосов
/ 03 мая 2011

Полуоткрытые интервалы имеют смысл по многим причинам, когда вы приступаете к этому. Например, с таким полуоткрытым интервалом количество элементов равно:

n = end - start

это довольно приятная и простая формула. Для закрытого интервала это будет:

n = (end - start) + 1

что (не много, но все же) сложнее.

Это также означает, что, например, строка, вся строка [1, len(s)], что также кажется интуитивно понятным. Если интервал был закрыт, чтобы получить всю строку, вам понадобится [1, len(s) + 1].

3 голосов
/ 03 мая 2011

Причина указана в разделе «Спецификация языка Go» на Ломтики .

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

    a[low : high]

создает подстроку или фрагмент. индексные выражения низкий и высокий выбор какие элементы появляются в результате. У результата есть индексы, начинающиеся с 0 и длина равна high - low.

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

Легко и эффективно рассчитать длину среза как высокую - низкую.

2 голосов
/ 03 мая 2011

Go использует полуоткрытые интервалы для слайсов, как и многие другие языкиВ более математической записи срез b[1:4] является интервалом [1,4), который исключает верхнюю конечную точку.

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