220

我试过了:

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

4

4 回答 4

312

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

你能得到的最近的是:

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 }

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

于 2012-10-30T11:00:47.843 回答
82

有效的开始:

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)。

于 2012-10-30T13:30:06.203 回答
15

Go 中没有数组常量之类的东西。

引用Go 语言规范:常量

布尔常量符文常量整数常量浮点常量复数常量字符串常量。符文、整数、浮点数和复数常量统称为数值常量

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

该规范列出了不同类型的常量。请注意,您可以使用具有一种允许类型作为基础类型的类型的常量表达式来创建和初始化常量。例如这是有效的:

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

如果需要数组,只能是变量,不能是常量。

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

于 2015-03-31T10:01:26.153 回答
7

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

我已经缩短了您的切片以使其...更短...:

func GetLetterGoodness() []float32 {
    return []float32 { .0817,.0149,.0278,.0425,.1270,.0223 }
}
于 2016-12-22T17:58:57.650 回答