Image Description

常量使用关键字 const定义,用于存储不会被修改的数据,是一种简单值的标识符。常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。

定义常量

const identifier [type] = value

代码示例

package main

import "fmt"

func main() {
   const LENGTH int = 10
   const WIDTH int = 5  

   var area int
   const a, b, c = 1, false, "str" //多重赋值

   area = LENGTH * WIDTH

   fmt.Printf("面积为 : %d", area)
   println()
   println(a, b, c)
}

用常量来做枚举,数字 0、1 和 2 分别代表未知性别、女性和男性:

const (
    Unknown = 0
    Female = 1 
    Male = 2
)

以上实例运行结果为:

abc 3 16

Golang中的iota

iota,特殊常量,可以认为是一个可以被编译器修改的常量。

在每一个 const关键字出现时,被重置为0,然后再下一个 const出现之前,每出现一次 iota,其所代表的数字会自动增加1。iota可以被用作枚举值:

const (
    a = iota
    b = iota
    c = iota
)

第一个 iota等于 0,每当 iota在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式

const (
    a = iota
    b
    c
)

代码示例

package main

import "fmt"

func main() {
    const (
      a = iota   //0
      b          //1
      c          //2
      d = "ha"   //独立值,iota += 1
      e          //"ha"   iota += 1
      f = 100    //iota +=1
      g          //100  iota +=1
      h = iota   //7,恢复计数
      i          //8
  )
  fmt.Println(a,b,c,d,e,f,g,h,i)
}

以上实例运行结果为:

0 1 2 ha ha 100 100 7 8

代码示例

package main

import "fmt"

const (
    i=1<<iota
    j=3<<iota
    k
    l
)

func main() {
    fmt.Println("i=",i)
    fmt.Println("j=",j)
    fmt.Println("k=",k)
    fmt.Println("l=",l)
}

运行结果:

i= 1
j= 6
k= 12
l= 24

iota 表示从 0开始自动加 1,所以 i=1<<0, j=3<<1(<< 表示左移的意思),即:i=1, j=6,这没问题,关键在 k 和 l,从输出结果看 k=3<<2,l=3<<3。

简单表述:

i=1:左移 0 位,不变仍为 1;

  • j=3:左移 1 位,变为二进制 110, 即 6;
  • k=3:左移 2 位,变为二进制 1100, 即 12;
  • l=3:左移 3 位,变为二进制 11000,即 24。

注:<<n==*(2^n)。