# 常量的定义

常量是一个简单值的标识符,在程序运行时,不会被修改的量。
常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。

格式:

1
const identifier [type] = value

和变量的声明相似,常量的定义使用关键字 const
和变量的声明相同,常量也可以省略类型说明符
[type](编译器可以根据 value 值来自动判断类型)

1
2
显式类型定义: const b string = "abc"
隐式类型定义: const b = "abc"

多个相同类型的定义可以缩写为

1
const c_name1, c_name2 = value1, value2

实例:

1
2
3
4
5
6
7
8
9
10
11
12
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)  
}

结果

常量用来枚举:

1
2
3
4
5
const (
Unknown = 0
Female = 1
Male = 2
)

0,1,2 分别代表未知性别,男,女
同时,常量可以使用内置函数来计算表达式的值,如 len (), cap (),
unsafe.Sizeof()

实例:

1
2
3
4
5
6
7
8
9
10
package main
import "unsafe"
const (
    a = "abc"
    b = len(a)
    c = unsafe.Sizeof(a)
)
func main(){
    println(a, b, c)
}

输出:

# iota

iota,特殊常量,可以认为是一个可以被编译器修改的常量。
iota 在 const 关键字出现时将被重置为 0 (const 内部的第一行之前),const
中每新增一行常量声明将使 iota 计数一次 (iota 可理解为 const
语句块中的行索引)。

iota 用来枚举:

1
2
3
4
5
const (
a = iota
b = iota
c = iota
)

第一行的 iota 为 0,接下来每增加一行,iota 的值都会加 1
因此例如 a=0,b=1,c=2 可以简写为

1
2
3
4
5
const (
a = iota
b
c
)

输出:


iota 用法:其实就是多加一行 iota 的值就多加 1,除非赋给常量另外的 value,不然每一行的值就是上一行 iota 的值 + 1(iota 的值不会被其它赋值干扰和打断),用一个实例来简单说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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)
}

输出:

看个移位实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)
}

输出:

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)。

简单来说,<< 符号代表着向左移位,a<<b 代表着将 a 的二进制位像左移动 b 位,在上述实例的枚举中,赋值给常量的值如果没有进行新的赋值那么就为上一行所赋的值不变,iota 每增加一行就 + 1,因此 k 和 l 都为 3,但是分别左移 2 位和 3 位即 k=3<<2,l=3<<3,即:

1
2
3
4
5
6
const (
    i=1<<0
    j=3<<1
    K=3<<2
    l=3<<3
)

更新于