常量的要求
- 使用const修饰
- 在定义的时候,必须初始化
- 定义后不能修改
- 常量值必须是编译期可确定的数字、字符串、布尔值
常量的定义格式:
const identifier [type] = value
你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。
- 显式类型定义: const b string = “Hello constant”
- 隐式类型定义(untyped): const b = “Hello constant”
多个相同类型的声明可以简写为:
const c_name1, c_name2 = value1, value2
// 声明一组常量
const (
start = 0x1
resume = 0x2
stop = 0x4
)
// 声明一组指定类型的常量
const (
start int8 = 0x1
resume int8 = 0x2
stop int8 = 0x4
)
// 用iota简化上面的写法
const (
start int8 = 1 << iota
resume
stop
)
字符串常量
字符串常量最简单的常量,通过了解字符串常量可以更好的理解常量的概念。
在Go中任何用双引号 “” 括起来的值都是字符串常量。比如 “Hello World”,”Vue” 都是字符串常量。
字符串常量是什么类型呢?答案是 无类型(untyped)。
像 “Hello World” 这样的字符串没有任何类型。
const hello = "Hello World"
上面的代码将 “Hello World” 赋给一个名为 hello 的常量。那么现在常量 hello 是不是就有了类型?
答案是:No。hello仍然没有类型。
// 编译器需要推导出 name 的类型
const hello = "Hello World"
// 那么它是如何从无类型的常量 "hello" 中获取类型的呢?
fmt.Printf("type is %T, value %v", hello, hello)
// type is string, value Hello World
答案是无类型常量有一个默认的类型,当且仅当代码中需要无类型常量提供类型时,它才会提供该默认类型。
const hello = "Hello World"
hello 需要一个类型,因此它从常量 “Hello World” 中获取其默认类型:string。