go语言学习之常量
常量在使用关键字
const
定义,用于存储不会改变的数据。
存储在常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
常量的定义格式:
const identifier [type] = value
,例如
在go语言中,你可以省略类型说明符
[type]
,因为编译器可以根据变量的值来推断其类型。
- 显示类型定义:
const b string = "abc"
- 隐式类型定义:
一个没有指定类型的常量被使用时会根据其使用环境而推断出它所需要具备的类型。话句话说,未定义类型的常量会在必要时刻根据上下文来获得相关类型。const b = "abc"
1. var n int
2. f(n + 5) // 无类型的数字型常量"5"它的类型在这里变成了 int
常量的值必须是能够在编译时就能够确定的;你可以在其赋值表达式中设计计算过程,但是所有用于计算的值必须在编译期间就能获得。
- 正确的做法:
const c1 = 2/3
- 错误的做法:
// 引发构建错误const c2 = getNumber()
因为在编译期间自定义函数均属于未知,因此无法用于常量的赋值,但内置函数可以使用,如:len()。getNumber() used as value
数字型的常量是没有大小和符号的,并且可以使用任何精度而不会导致溢出:
1. const Ln2= 0.693147180559945309417232121458\
176568075500134360255254120680009
2. const Log2E= 1/Ln2 // this is a precise reciprocal
3. const Billion = 1e9 // float constant
4. const hardEight = (1 << 100) >> 97
根据上面的例子我们可以看出,反斜杠
\
可以在常量表示式中作为多行的连接符使用。
与各种类型的数字型变量相比,你无需担心常量之间的类型转换问题,因为它们都是非常理想的数字。
不过需要注意的是,当常量赋值给一个精度过小的数字型变量是,可能会因为无法正确表达常量所代表的数值而导致溢出,这会在编译期间就引发错误。另外,常量也允许使用并行赋值的形式:
1. const beef, two, c = "eat", 2, "veg"
2. const Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
3. const (
4. Monday, Tuesday, Wednesday = 1, 2, 3
5. Thursday, Friday, Saturday = 4, 5, 6
6. )
还可以用作枚举:
1. const (
2. Unknown = 0
3. Female = 1
4. Male = 2
5. )
现在,数字0、1和2分别代表未知性别、女性和男性。这些枚举值可以用于测试某个变量或常量的实际值,比如使用switch/case结构
在这个例子中,
iota
可以用作枚举值:
1. const (
2. a = iota
3. b = iota
4. c = iota
5. )
第一个
iota
等于0,每当
iota
在新的一行被使用时,它的值都会自动加1;所以
a=0, b=1 c=2
可以简写为如下形式:
1. const (
2. a = iota
3. b
4. c
5. )
iota
也可以用在表达式中,如:
iota + 50
。在每遇到一个新的常量块或单个常量声明时,
iota
都会重置为0(简单地讲,每遇到一次const关键字,
iota
就重置为0)。
当然,之所以为常量就是恒定不变的量,因此我们无法在程序运行过程中修改它的值;如果你在代码中试图修改常量的值则会引发编译错误。
引用
time
包中的一段代码作为示例:一周中每天的名称
1. const (
2. Sunday = iota
3. Monday
4. Tuesday
5. Wednesday
6. Thursday
7. Friday
8. Saturday
9. )
你也可以使用某个类型作为枚举常量的类型:
1. type Color int
2. const (
3. RED Color = iota // 0
4. ORANGE // 1
5. YELLOW // 2
6. GREEN // ..
7. BLUE
8. INDIGO
9. VIOLET // 6
10. )