声明一个常量数组

新手上路,请多包涵

我努力了:

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

原文由 ceth 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 7k
2 个回答

数组本质上不是不可变的;你不能让它保持不变。

你能得到的最近的是:

 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 }

请注意 [...] 而不是 [] :它确保您获得(固定大小)数组而不是切片。所以值不是固定的,但大小是。

正如 @jimt 所指出的, [...]T 语法是 [123]T 的糖分。它创建一个固定大小的数组,但让编译器计算出其中有多少元素。

原文由 Denys Séguret 发布,翻译遵循 CC BY-SA 4.0 许可协议

来自 Effective Go

Go 中的常量就是常量。它们是在编译时创建的,即使在函数中定义为局部变量时也是如此,并且只能是数字、字符(符文)、字符串或布尔值。由于编译时限制,定义它们的表达式必须是常量表达式,可由编译器计算。例如, 1<<3 是常量表达式,而 math.Sin(math.Pi/4) 不是因为对 math.Sin 的函数调用需要在运行时发生。

切片和数组总是在运行时计算:

 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 仅在它定义的包中可用。如果您需要从外部进行读取访问,您可以编写一个简单的 getter 函数(请参阅 golang 中的 Getters )。

原文由 fasmat 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题