全部:
当我尝试遵循golang的“围棋之旅”时:
我的代码是这样的:
prog.go:6:8: const initializer dx is not a constant
prog.go:7:8: const initializer dy is not a constant
我遇到了类似的错误:
{{1}}
我刚开始使用Go,我想知道这个错误是什么意思,如果我想先构建一个数组(除了使用make()来构建slice之外),如何传递数组的长度?
答案 0 :(得分:2)
错误
错误来自尝试从变量定义常量。在Go中,常量必须定义为从其他常量构建的文字或表达式。 x
和y
的定义取决于Pic
函数的输入。通常,常量是在编译时定义的。
例如,在Go中可以满足以下要求:
const w = 100
const x = 200
const y = w + x
const z = x + y + 300
但是以下不是:
var x = 100
const y = x + 10
第二个示例实质上就是代码中发生的事情,因为dx
和dy
取决于Pic
函数的输入。
如果您来自JavaScript(它也带有const
关键字),这可能看起来很奇怪。在JavaScript中,常量基本上只是一个在声明后不能更改的变量。在Go中,常量比在JS中更常量。
在Go中查看有关此常量的更多信息:https://blog.golang.org/constants
创建阵列
数组大小与Go中的常量值具有相似的约束。在此示例中,如果您尝试将数组的大小设置为等于dx
或dy
,则会出现错误:
非常数数组绑定dx
因此,在此示例中,您将必须使用切片。最简单的方法是使用长度dy
来定义您的Slice,例如:
pic := make([][]uint8, dy)
答案 1 :(得分:1)
没有常量值。例如,
package main
import "golang.org/x/tour/pic"
func Pic(dx, dy int) [][]uint8 {
p := make([][]uint8, dy)
for x := range p {
p[x] = make([]uint8, dx)
for y := range p[x] {
p[x][y] = uint8(x * y)
}
}
return p
}
func main() {
pic.Show(Pic)
}