文章目录
- 简介
- 无类型常量
- 特殊常量iota
简介
道可道,非常道。这里常道指的永恒不变的道理,常有不变的意思。顾名思义和变量相比,常量在声明之后就不可改变,它的值是在编译期间就确定的。
下面简单的声明一个常量:
const p int = 1
声明常量的时候可以指定类型也可以类似
:=
简单声明一样,不指定类型如下:
const p = 1
也可以同时给多个赋值:
const i, j = 1, 2const m, n = 1, \"a\"
也可以批量的声明:
const (a = 0b = 1)
如果批量的声明,后面的可以省略声明具体的值,它会和上一行的值保持一致比如:
const (a = 1bc = 2d)fmt.Println(a, b, c, d) // \"1 1 2 2\"
无类型常量
我们曾多次提到
Go
是一门静态语言,变量的类型是不可变,甚至不可以对
int
和
int32
两种类型的变量进行
+
操作,即使
int
也是
32
位的例如:
package mainimport \"fmt\"func main() {var a int = 1var b int32 = 2fmt.Println(a + b)}
编译的时候会报invalid operation: a + b (mismatched types int and int32)
而简单声明的变量又是什么类型呢把上面的代码修改
package mainimport \"fmt\"func main() {a := 1var b int = 2fmt.Println(a + b)}
发现是可以运行的,但是如果把
b
改成
var b int32 = 2
也会报相同的错误,说明
:=
会给变量指定一个默认的数据类型,这个类型是确定。
常量和变量有一个很大的不同就是,它对六种基础数据类型
布尔、整数、字符、浮点数、复数、字符串
,如果声明的时候没有明确指定类型,它是
不确定类型
的,而是用到它的时候再确定它是否满足这个类型的运行去确定它具体的类型。回到上面的代码,我们如果改成这样:
package mainimport \"fmt\"func main() {const a = 1var b int32 = 2fmt.Println(a + b)}
这时运行通过,运行的时候
a
是 int32类型。那么是不是它以后一直是这一种类型呢,我们看看下面的代码:
package mainimport \"fmt\"func main() {const a = 1var b int32 = avar c int = afmt.Println(a)fmt.Println(c)}
我们可以看到
c
和
b
不是相同类型,但还是可以把
a
即赋值给
b
也可以赋值给
c
。也就是说只要是整数,不论是什么类型都可以参与运行。同样的道理,只要声明常量的时候没有指定类型,给它的赋值又是六种基本类型,常量都可以满足这个特性。
特殊常量iota
iota
可以理解为一个特殊的常量,它只能和
const
一起出现,而且只要
const
出现它就会被重置为
0
,然后每有一个常量被声明它就加
1
package mainimport \"fmt\"func main() {const (a = iotabc)println(a, b, c) // 0 1 2const (d = iotaef)fmt.Println(d, e, f) // 0 1 2}
上面的
a, b, c
的声明从0开始,每增加一行就加1。到
d, e, f
之后由于出现了
const
所以
iota
又被重置为
0
了。
iota
也可以在声明中参加运算,例如
const (a = iota * 3bc)fmt.Println(a, b, c) // 0 3 6
下面一行保持和第一行相同的运行规则只是
iota
加
1
了,所以相当于
b = 3 * 1