无类型常量
常量是现代编程语言中最常见的语法元素。Go 语言是站在 C 语言等编程语言肩膀上诞生的,它原生提供了常量定义关键词 const
。
Go 语言中的 const
整合了 C 语言中的宏定义常量、cosnt 只读变量和枚举常量三种形式,并消除每种形式的不足。
const (
a = 1
b = 2
c = 3
)
有类型常量带来的烦恼
Go 对类型安全是非常严格的,常量也不例外。常量的类型是在编译期确定的,而不是在运行期确定的。
type myInt int
func main() {
var a int = 5
var b myInt = 5
println(a + b) // invalid operation: a + b (mismatched types int and myInt)
}
上面例子可以看到,两个类型即便是底层类型相同,但是类型不同,也不能进行运算。
可以使用显式类型转换:
type myInt int
func main() {
var a int = 5
var b myInt = 5
println(a + int(b)) // 10
}
有类型的常量与变量混合在一起进行运算求值时,也要遵循这个类型安全要求,如果有类型的常量与变量的类型不同,就有这个问题。
无类型常量消除烦恼
无类型常量的类型在编译器运算期间可以根据上下文的变化而变化。
const (
a = 5
pi = 3.1415
s = "Hello"
c = 'a'
b = false
)
type myInt int
type myFloat float32
type myString string
type myBool bool
func main() {
var j myInt = a
var f myFloat = pi
var str myString = s
var e myBool = b
println(j, f, str, e) // 5 3.1415 Hello false
}
无类型常量使得 Go 在处理表达式混合数据类型时具有更大的灵活性。代码编写也有所简化,无须在求值时进行类型转换。
无类型常量也会有自己的默认类型,比如整数的无类型常量的默认类型是 int,浮点数的无类型常量的默认类型是 float64,字符串的无类型常量的默认类型是 string,布尔值的无类型常量的默认类型是 bool。
const (
a = 5
s = "Hello"
)
func main() {
n := and
var i interface{} = a
fmt.Printf("%T\n", n) // int
fmt.Printf("%T\n", i) // int
i = s
fmt.Printf("%T\n", i) // string
}