Я пытался:
const ascii = "abcdefghijklmnopqrstuvwxyz"
const letter_goodness []float32 = { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 }
const letter_goodness = { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 }
const letter_goodness = []float32 { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 }
Во-первых, объявление и инициализация работают нормально, но второй, третий и четвертый не работают. Как я могу объявить и инициализировать массив const с плавающей точкой?
[...]T
синтаксис является сахаром для[123]T
. Он создает массив фиксированного размера, но позволяет компилятору выяснить, сколько в нем элементов.f(xs [5]int)
вы бы не знали, был ли переданный массив постоянным или изменяемым.cannot use constants.FilesRequired (type [4]string) as type []string in argument to strings.Join
С Эффективного Go :
Срезы и массивы всегда оцениваются во время выполнения:
[...]
говорит компилятору вычислить длину самого массива. Ломтики обертывают массивы и с ними легче работать в большинстве случаев. Вместо использования констант просто сделайте переменные недоступными для других пакетов, используя первую букву в нижнем регистре:thisIsPrivate
доступно только в пакете, который он определил. Если вам нужен доступ для чтения извне, вы можете написать простую функцию получения (см. Раздел «Получение в golang» ).источник
В Go нет такого понятия, как константа массива.
Цитирование из спецификации языка Go: Константы :
Постоянное выражение (которое используется для инициализации константы) может содержать только постоянные операнды и вычисляется во время компиляции.
В спецификации перечислены различные типы констант. Обратите внимание, что вы можете создавать и инициализировать константы с помощью константных выражений типов, имеющих один из разрешенных типов в качестве базового типа . Например, это действительно:
Вывод (попробуйте на Go Playground ):
Если вам нужен массив, он может быть только переменной, но не константой.
Я рекомендую эту замечательную статью в блоге о константах: Константы
источник
var arr = [2]int{2, 3}
Как уже упоминалось, для этого не существует официальной конструкции Go. Самое близкое, что я могу себе представить, - это функция, которая возвращает срез. Таким образом, вы можете гарантировать, что никто не будет манипулировать элементами исходного среза (так как он «жестко запрограммирован» в массиве).
Я сократил ваш кусок, чтобы сделать его ... короче ...
источник
cannot use [6]string literal (type [6]string) as type []string in return argument
такreturn []float32 { ... }
...
чтобы объявить литерал среза вместо литерала массива. (2) измените тип возврата на[6]float32
. (3) присвоить выражение переменной массива,a := [...]float32 { (etc.) }
и возвращает срез всех элементов:return a[:]
. (Литералы массива не адресуемы, я не понимаю, почему.)