Нарезка массива литерала - PullRequest
       8

Нарезка массива литерала

0 голосов
/ 10 февраля 2020

Я считаю, что есть небольшая проблема со спецификацией Go. Следующее жалуется на то, что литерал массива не адресуем:

    print([4]int{2,3}[:2])

Я знаю, почему массив, возвращаемый функцией, не адресуем (например, Ошибка при адресации возвращенного фрагмента функции ), но почему массив, например [4]int{2,3}, не адресуемый? Особенно, когда срезы и строковые литералы - например, они работают нормально:

    print([]int{2,3,0,0}[:2])
    print("2300"[:2])

Более того, литералы массива, кажется, адресуемы, поскольку &[4]int{42,43} является допустимым выражением.

Я знаю, что могу используйте фрагмент

    print([]int{2,3,0,0}[:2])

но что, если бы я хотел, чтобы емкость (длина массива) была константой времени компиляции.

    const maxLength = 4
    ...
    print([maxLength]int{2,3}[:2])

И да, я могу назначить временную переменную массива , но зачем мне это?

1 Ответ

5 голосов
/ 10 февраля 2020

Используйте следующее:

fmt.Println((&[4]int{2, 3})[:2])

Спецификация говорит это о выражениях срезов :

Если операнд с нарезкой является массивом, он должен быть адресуемый.

и это об адресуемости :

Операнд должен быть адресуемым, то есть либо переменной, либо косвенным указателем, либо индексированием слайса операция; или селектор поля адресуемого структурного операнда; или операция индексации массива адресуемого массива. В качестве исключения из требования адресуемости, x также может быть составным литералом (возможно, заключенным в скобки).

Массив не адресуемый, но исключение составного литерала можно использовать для получения адресуемого значения.

Операнды массива должны быть адресуемыми, поскольку элементы результирующего среза являются адресуемыми. Строковые операнды не обязательно должны быть адресуемыми, потому что строковые элементы никогда не адресуемы.

...