Go 语言
声明、类型、语句与控制结构
无类型常量

无类型常量

常量是现代编程语言中最常见的语法元素。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
}