声明一个常量数组

dem*_*mas 134 arrays const go

我试过了:

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 }
Run Code Online (Sandbox Code Playgroud)

首先,声明和初始化工作正常,但第二,第三和第四不起作用.如何声明和初始化const数组的浮点数?

Den*_*ret 199

数组本质上不是一成不变的; 你不能让它不变.

你可以得到的最近的是:

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 }
Run Code Online (Sandbox Code Playgroud)

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

  • 只是为了澄清:`[...] T`语法是`[123] T`的糖.它创建一个固定大小的数组,但让编译器计算出其中有多少个元素. (112认同)
  • 我想允许常量数组需要更新类型系统.否则,如果您定义了函数`f(xs [5] int)`,您将不知道传递的数组是常量还是可变的. (4认同)

fas*_*mat 55

Effective Go开始:

Go中的常量只是常数.它们是在编译时创建的,即使在函数中定义为locals时也是如此,并且只能是数字,字符串或布尔值.由于编译时限制,定义它们的表达式必须是常量表达式,可由编译器评估.例如,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}
Run Code Online (Sandbox Code Playgroud)

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

var ThisIsPublic = [2]float32 {.03, .02}
var thisIsPrivate = [2]float32 {.03, .02}
Run Code Online (Sandbox Code Playgroud)

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


icz*_*cza 9

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)
}
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

main.Myint 1
main.Myint 2
Run Code Online (Sandbox Code Playgroud)

如果需要数组,它只能是变量,而不是常量.

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


小智 6

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

我缩短了你的切片以使其......更短......:

func GetLetterGoodness() []float32 {
    return []float32 { .0817,.0149,.0278,.0425,.1270,.0223 }
}
Run Code Online (Sandbox Code Playgroud)

  • 这听起来是最好的方法,但是 func 返回类型不匹配。`不能使用 [6] 字符串文字(类型 [6] 字符串)作为返回参数中的类型 [] 字符串` 所以 `return []float32 { ... }` (4认同)