(1) 字面常量

Go语言 的字面常量更接近我们自然语言中的常量概念,它是无类型的。
只要这个常量在相应类型的值域 范围内,就可以作为该类型的常量,比如上面的常量-12,它可以赋值给int、uint、int32、 int64、float32、float64、complex64、complex128等类型的变量。

  1. -12
  2. 3.14159265358979323846 // 浮点类型的常量
  3. 3.2+12i // 复数类型的常量
  4. true // 布尔类型的常量
  5. "foo" // 字符串常量

(2) 定义常量

Go的常量定义可以限定常量类型,但不是必需的。
如果定义常量时没有指定类型,那么它 与字面常量一样,是无类型常量。

  1. const Pi float64 = 3.14159265358979323846
  2. const zero = 0.0 // 无类型浮点常量
  3. const u, v float32 = 0, 3 // u = 0.0, v = 3.0,常量的多重赋值
  4. const a, b, c = 3, 4, "foo" //a=3,b=4,c="foo", 无类型整型和字符串常量
  5. const (
  6. size int64 = 1024
  7. eof = -1 // 无类型整型常量
  8. )

常量定义的右值也可以是一个在编译期运算的常量表达式,比如
const mask = 1 << 3
由于常量的赋值是一个编译期行为,所以右值不能出现任何需要运行期才能得出结果的表达式,比如试图以如下方式定义常量就会导致编译错误:
const Home = os.GetEnv(“HOME”)
原因很简单,os.GetEnv()只有在运行期才能知道返回结果,在编译期并不能确定

(3) 预定义常量

Go语言预定义了这些常量:true、false和iota。
iota比较特殊,可以被认为是一个可被编译器修改的常量,在每一个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1。
image.png

(4) 枚举

Go语言并不支持众多其他语言明确支持的enum关键字。

  1. const (
  2. Sunday = iota
  3. Monday
  4. Tuesday
  5. Wednesday
  6. Thursday
  7. Friday
  8. Saturday
  9. )