简介
常量可以说在每个代码文件中都存在,使用常量有很多好处:
避免魔法字面量,即直接出现在代码中的数字,字符串等。阅读代码的时候无法一眼看出它的含义。另外可以避免使用字面量可能出现的不一致,当它们的值需要修改时,常量只需修改一处,而字面量要修改多处,容易遗漏造成不一致;
相对于变量,常量可以执行编译期优化。
Go 语言也提供了常量的语法支持,与其他语言提供的常量基本一致。但是 Go 中的常量有几个有用的特性值得了解一下。
常量基础
Go 语言中使用const
关键字定义常量:
package main
import "fmt"
const PI float64 = 3.1415926
const MaxAge int = 150
const Greeting string = "hello world"
func main() {
fmt.Println(PI)
fmt.Println(MaxAge)
fmt.Println(Greeting)
}
多个常量定义可以合并在一起,如上面的几个常量定义可以写成下面的形式:
const (
PI float64 = 3.1415926
MaxAge int = 150
Greeting string = "hello world"
)
不过通常建议将相同类型的,相关联的常量定义在一个组里面。
Go 语言中常量有一个很大的限制:只能定义基本类型的常量,即布尔类型(bool
),整数(无符号uint/uint8/uint16/uint32/uint64/uintptr
,有符号int/int8/int16/int32/int64
),浮点数(单精度float32
,双精度float64
),或者底层类型是这些基本类型的类型。不能定义切片,数组,指针,结构体等这些类型的常量。例如,byte
底层类型为uint8
,rune
底层类型为int32
,见 Go 源码builtin.go
:
// src/builtin/builtin.go
type byte = uint8
type rune = int32
故可以定义类为byte
或rune
的常量:
const b byte = 128
const r rune = 'c'
定义其他类型的变量会在编译期报错:
type User struct {
Name string
Age int
}
const u User = User{} // invalid cons