Объявить константный массив



Я пробовал:



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 }


во-первых, объявление и инициализация работает нормально, но второй, третий и четвертый не работают. Как я могу объявить и инициализировать константный массив поплавков?

480   4  

4 ответов:

массив не является неизменным по своей природе; вы не можете сделать его постоянным.

ближайший вы можете получить это:

var 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 }

Примечание [...] вместо []: это гарантирует, что вы получите массив (фиксированного размера) вместо среза. Таким образом, значения не фиксированы, но размер есть.

С Эффективный Go:

константы в Go - это просто константа. Они создаются во время компиляции, даже если определены как локальные в функциях, и могут быть только числами, строками или логическими значениями. Из-за ограничения времени компиляции выражения, которые их определяют, должны быть постоянными выражениями, вычисляемыми компилятором. Например, 1

срезы и массивы всегда вычисляются во время выполнения:

var TestSlice = []float32 {.03, .02}
var TestArray = [2]float32 {.03, .02}
var TestArray2 = [...]float32 {.03, .02}

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

var ThisIsPublic = [2]float32 {.03, .02}
var thisIsPrivate = [2]float32 {.03, .02}

thisIsPrivate доступно только в пакете определяется. Если вам нужен доступ для чтения из снаружи вы можете написать простую функцию геттера (см. геттеры в golang).

в Go нет такой вещи, как константа массива.

слово Перейти Спецификация Языка: Константы:

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

A константное выражение (который используется для инициализации константы) может содержать только постоянный операнды и вычисляются во время компиляции.

в спецификации перечислены различные типы констант. Обратите внимание, что вы можете создавать и инициализировать константы с помощью постоянные выражения типов, имеющих один из разрешенных типов в качестве базовый тип. Например это действительно:

func main() {
    type Myint int
    const i1 Myint = 1
    const i2 = Myint(2)
    fmt.Printf("%T %v\n", i1, i1)
    fmt.Printf("%T %v\n", i2, i2)
}

выход (попробуйте его на Go Playground):

main.Myint 1
main.Myint 2

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

Я рекомендую эту замечательную статью в блоге о константах: константы

Как уже упоминалось, для этого нет официальной конструкции Go. Самое близкое, что я могу себе представить, это функция, которая возвращает срез. Таким образом, вы можете гарантировать, что никто не будет манипулировать элементами исходного среза (поскольку он "жестко закодирован" в массив).

я сократил ваш кусок, чтобы сделать это...укорачиваться...:

func GetLetterGoodness() []float32 {
    return [...]float32 { .0817,.0149,.0278,.0425,.1270,.0223 }
}

Comments

    Ничего не найдено.