常量指的是在编译期间已知的且不可改变的数据类型,常量可以是数值类型、浮点型、复合类型、布尔类型、字符串类型,在go中任何编译器后试图改变常量的操作都会导致编译报错。

定义常量

在go中我们可以使用const来定义常量,以下是常见的击中定义方式

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

预定义常量

go中预定义的常量有 true,false,iota
iota比较特殊,它是一个可以被编译器修改的常量。在编译期间每次const关键字出现时iota都会被重置为0,直到下一个const出现前,每出现一次iota都会递增。

  1. package main
  2. import "fmt"
  3. const (
  4. a1 = iota
  5. a2 = iota
  6. a3 = iota
  7. )
  8. const (
  9. b1 = iota * 2
  10. b2 = iota * 2
  11. b3 = iota * 2
  12. )
  13. const (
  14. c1 = iota * 3
  15. c2
  16. c3
  17. )
  18. func main() {
  19. fmt.Printf("a1 is %d \n", a1)
  20. fmt.Printf("a2 is %d \n", a2)
  21. fmt.Printf("a3 is %d \n", a3)
  22. fmt.Printf("b1 is %d \n", b1)
  23. fmt.Printf("b2 is %d \n", b2)
  24. fmt.Printf("b3 is %d \n", b3)
  25. fmt.Printf("c1 is %d \n", c1)
  26. fmt.Printf("c2 is %d \n", c2)
  27. fmt.Printf("c2 is %d \n", c3)
  28. }

枚举

go中并没有其他语言类似的enum 关键字,而是通过,const后跟一对圆括号定义一组常量的方式来实现枚举。

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

常量作用域

跟变量一致,以大写开头的常量是可以在当前包和外部包进行访问的(public),以小写开头的常量只能在当前包中进行访问。