如果您来自一种非类型化语言,则常量在Go中可能会令人困惑,并且很容易被误用。让我们来看看它们在围棋中如何工作的一些细微差别的细节。这可能并不令人惊讶,但Go的常量几乎与JavaScript对该概念的混蛋版本完全不同。
必须能够在编译时赋值。常量的值不能是运行时计算的结果。
仅适用于某些类型。数组、切片、贴图、结构等…。不能使其成为常量。
不能重新分配,但可以改变。JavaScript的常量极具误导性。Const关键字没有定义常量值。它定义对值的常量引用。
如果常量是具有更改的内部工作方式的类型(如数组或对象),则可以更改内部引用。
如果您来自JavaScript,您会得到的结论是Go的常量只是不同而已。它们处理编译时的值,而不是一成不变的命名。
在围棋中,常量提供关于它们所持有的值的完全安全。它们无法计算(减少了使用频率),但可以保证始终引用相同的值。
在JavaScript中,const所做的就是确保不能将相同的名称更改为引用相同作用域中的不同变量。
必须在程序运行之前分配GO中的常量。使用GO BUILD编译程序时,将计算并保存所有常量。常量可以依赖于其他常量的值,但不依赖于运行时计算。例如:
之所以有效,是因为这两个值都可以在程序运行之前知道。以下操作将不起作用:
这不会起作用,因为More依赖于运行时变量分钟。请记住,这在JavaScript中是有效的,因为javascript中常量的唯一规则是它们不能被重新赋值。
Go编译器不需要担心常量改变它的值,因此它可以用不变的数字交换const的每个实例。这使得常量稍微快一些。
数值常量可以比普通变量大得多,精度也高得多,因为它们具有任意精度。将数值常量分配给变量时,它们必须能够适应要分配到的类型的大小。请看以下例子:
大数字不能打印,但我们仍然可以在计算中使用它:
Fmt.Println(大)//韩元t编译mall:=(Large/1e9999)//按预期工作dfmt.Println(小)//打印10。
仍然可以使用像E这样的高精度浮点数,但是当将高精度赋值给Float64或Float32时,高精度就会丢失。
尽可能使用常量。为什么你会想要意外地改变一个你知道永远不应该改变的值呢?让编译器将您从您自己中解救出来,并尽可能多地使用常量。
您可能熟悉这样一种想法,即编程中的全局变量不是一个好主意。变量通常应该属于尽可能小的范围。
GO中的常量不适用于全局变量规则,声明全局常量没有错。当然,如果常量只在一个地方使用,那么在那里声明它可能是有意义的。不过,问题仍然存在:在全局范围内声明常量并不危险。
数字、布尔和字符串类型都可以设置为常量。这包括诸如符文、浮点数、整数之类的内容,甚至包括基于有效基础类型的自定义类型。例如:
其他类型(如数组、切片和映射)不能声明为常量。这是有意义的,因为这些类型本质上只是指针,它们是可变数据的地址。然而,我已经写了另一篇文章,关于在围棋中获得“有效恒定”的切片和地图的优雅方法。
相比之下,在JavaScript中,任何东西都可以成为常量。JavaScript数组可以声明为常量,但这并不能阻止程序员改变数组的元素!JavaScript的const提供的唯一安全性是变量不能被显式重新赋值。
非类型化字符串的行为在很大程度上类似于字符串。也就是说,它是String类型,但没有String类型的go值。为了使其成为字符串的官方GO类型,必须声明: