声明一个常量数组

我努力了:

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数组?

一个数组本身并不是不变的, 你不能使它保持不变。

最近你可以得到的是:

 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中的常量只是常数。 它们是在编译时创build的,即使在函数中定义为locals,也只能是数字,string或布尔值。 由于编译时限制,定义它们的expression式必须是常量expression式,可由编译器进行评估。 例如,1 << 3是一个常量expression式,而math.Sin(math.Pi / 4)并不是因为函数调用math.Sin需要在运行时发生。

在运行时总是评估片和数组:

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

[...]告诉编译器计算出数组本身的长度。 切片包装数组,更容易在大多数情况下使用。 而不是使用常量,只是通过使用小写的第一个字母使variables无法访问其他包:

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

thisIsPrivate仅在定义的包中可用。 如果您需要从外部读取访问权限,则可以编写一个简单的getter函数(请参阅golang in golang )。

Go中没有数组常量这样的事情。

引用Go语言规范:常量 :

布尔常量符文常量整型常量浮点常量复常量string常量 。 符文,整数,浮点数和复数常量统称为数字常量

常量expression式 (用于初始化一个常量)可能只包含常量操作数,并在编译时进行评估。

规范列出了不同types的常量。 请注意,您可以使用常量expression式中的某个允许的types作为基础types来创build和初始化常量。 例如,这是有效的:

 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 

如果你需要一个数组,它只能是一个variables,而不是一个常量。

我推荐这篇关于常量的好博客文章: 常量

正如其他人所提到的那样,没有官方的Go结构。 我能想象的最接近的是一个返回一个切片的函数。 通过这种方式,你可以保证没有人会操纵原始片段的元素(因为它被“硬编码”到数组中)。

我已经缩短了你的切片,使它…更短…:

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