1:定义
(1)"常量"用于表示固定的值,关键字const被用于表示常量
var a int = 11
var b string = "Go"
上面示例中:变量a和b分别被赋予常量11和GO,示例中我们没有明确的使用关键字const,但在Go的内部,它们是常量
(2)常量不能再重新赋值为其他的值
下面的程序将不能正常工作,它将出现一个编译错误: cannot assign to a
package main
func main() {
const a = 55 // 允许
a = 89 // 不允许重新赋值
}
(3)常量的值会在编译的时候确定
函数的返回值不能赋值给常量,原因是函数调用时运行是发生的
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println("Hello, playground")
var a = math.Sqrt(4) // 允许
const b = math.Sqrt(4) // 不允许
}
上面示例中:a是变量,可以将函数math.Sqrt(4)的返回值赋值给它,b是一个常量,它需要在编译的事情就确定,而函数只会在运行是计算,所有const b = math.Sqrt(4)会抛异常
(4)常量是无类型的
无类型的常量有一个与它们相关联的默认类型,并且当且仅当一行代码需要时才提供它
package main
import (
"fmt"
)
func main() {
var name = "Sam"
fmt.Printf("type %T value %v", name, name)
}
在声明中 var name = “Sam” , name 需要一个类型,它从字符串常量 Sam 的默认类型中获取。
2:字符串常量
双引号中的任何值都是 Go 中的字符串常量,Go 是一个强类型的语言,在分配过程中混合类型是不允许的
package main
func main() {
var defaultName = "Sam" // 允许
type myString string
var customName myString = "Sam" // 允许
customName = defaultName // 不允许
}
创建一个变量 defaultName 并分配一个常量 Sam 。常量 Sam 的默认类型是 string
所以在赋值后 defaultName 是 string 类型的。接下来我们将创建一个新类型 myString,它的底层类型是 string,
然后我们创建一个 myString 的变量 customName 并且给他赋值一个常量 Sam 。因为常量 Sam 是无类型的,它可以分配给任何字符串变量。因此这个赋值是允许的,customName 的类型是 myString。
现在,我们有一个类型为 string 的变量 defaultName 和另一个类型为 myString 的变量 customName。即使我们知道这个 myString 是 string 类型的别名。Go 的类型策略不允许将一种类型的变量赋值给另一种类型的变量。因此将 defaultName 赋值给 customName 是不允许的,编译器会抛出一个错误 main.go:7:20: cannot use defaultName (type string) as type myString in assignmen。
3:布尔常量
布尔常量和字符串常量没有什么不同。他们是两个无类型的常量 true 和 false
package main
func main() {
const trueConst = true
type myBool bool
var defaultBool = trueConst // 允许
var customBool myBool = trueConst // 允许
defaultBool = customBool // 不允许
}
4:数字常量
数字常量包含整数、浮点数和复数的常量
package main
import (
"fmt"
)
func main() {
const a = 5
var intVar int = a
var int32Var int32 = a
var float64Var float64 = a
var complex64Var complex64 = a
fmt.Println("intVar",intVar, "\nint32Var", int32Var, "\nfloat64Var", float64Var, "\ncomplex64Var",complex64Var)
}
在这个程序中, a 的值是 5 ,a 的语法是通用的(它可以代表一个浮点数、整数甚至是一个没有虚部的复数),因此可以将其分配给任何兼容的类型。这些常量的默认类型可以被认为是根据上下文在运行中生成的。 var intVar int = a 要求 a 是 int,所以它变成一个 int 常量。 var complex64Var complex64 = a 要求 a 是 complex64,因此它变成一个复数类型
5:数字表达式
数字常量可以在表达式中自由混合和匹配,只有当它们被分配给变量或者在需要类型的代码中的任何地方使用时,才需要类型
package main
import (
"fmt"
)
func main() {
var a = 5.9/8
fmt.Printf("a's type %T value %v",a, a)
}
在上面的程序中, 5.9 在语法中是浮点型,8 是整型,5.9/8 是允许的,因为两个都是数字常量。除法的结果是 0.7375 是一个浮点型,所以 a 的类型是浮点型