常量的要求

  • 使用const修饰
  • 在定义的时候,必须初始化
  • 定义后不能修改
  • 常量值必须是编译期可确定的数字、字符串、布尔值

常量的定义格式:

  1. const identifier [type] = value

你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。

  • 显式类型定义: const b string = “Hello constant”
  • 隐式类型定义(untyped): const b = “Hello constant”

多个相同类型的声明可以简写为:

  1. const c_name1, c_name2 = value1, value2
  1. // 声明一组常量
  2. const (
  3. start = 0x1
  4. resume = 0x2
  5. stop = 0x4
  6. )
  7. // 声明一组指定类型的常量
  8. const (
  9. start int8 = 0x1
  10. resume int8 = 0x2
  11. stop int8 = 0x4
  12. )
  13. // 用iota简化上面的写法
  14. const (
  15. start int8 = 1 << iota
  16. resume
  17. stop
  18. )

字符串常量

字符串常量最简单的常量,通过了解字符串常量可以更好的理解常量的概念。

在Go中任何用双引号 “” 括起来的值都是字符串常量。比如 “Hello World”,”Vue” 都是字符串常量。

字符串常量是什么类型呢?答案是 无类型(untyped)。

像 “Hello World” 这样的字符串没有任何类型。

  1. const hello = "Hello World"

上面的代码将 “Hello World” 赋给一个名为 hello 的常量。那么现在常量 hello 是不是就有了类型?
答案是:No。hello仍然没有类型。

  1. // 编译器需要推导出 name 的类型
  2. const hello = "Hello World"
  3. // 那么它是如何从无类型的常量 "hello" 中获取类型的呢?
  4. fmt.Printf("type is %T, value %v", hello, hello)
  5. // type is string, value Hello World

答案是无类型常量有一个默认的类型,当且仅当代码中需要无类型常量提供类型时,它才会提供该默认类型。

  1. const hello = "Hello World"

hello 需要一个类型,因此它从常量 “Hello World” 中获取其默认类型:string。