道可道,很是道。这里常道指的永恒不变的道理,常有不变的意思。顾名思义和变量相比,常量在声明以后就不可改变,它的值是在编译期间就肯定的。
下面简单的声明一个常量:code
const p int = 1
声明常量的时候能够指定类型也能够相似:=
简单声明同样,不指定类型以下:字符串
const p = 1
也能够同时给多个赋值:io
const i, j = 1, 2 const m, n = 1, "a"
也能够批量的声明:编译
const ( a = 0 b = 1 )
若是批量的声明,后面的能够省略声明具体的值,它会和上一行的值保持一致好比:class
const ( a = 1 b c = 2 d ) fmt.Println(a, b, c, d) // "1 1 2 2"
咱们曾屡次提到Go
是一门静态语言,变量的类型是不可变,甚至不能够对int
和int32
两种类型的变量进行+
操做,即便int
也是32
位的例如:import
package main import "fmt" func main() { var a int = 1 var b int32 = 2 fmt.Println(a + b) }
编译的时候会报invalid operation: a + b (mismatched types int and int32)
而简单声明的变量又是什么类型呢把上面的代码修改基础
package main import "fmt" func main() { a := 1 var b int = 2 fmt.Println(a + b) }
发现是能够运行的,可是若是把b
改为var b int32 = 2
也会报相同的错误,说明:=
会给变量指定一个默认的数据类型,这个类型是肯定。
常量和变量有一个很大的不一样就是,它对六种基础数据类型 布尔、整数、字符、浮点数、复数、字符串
,若是声明的时候没有明确指定类型,它是不肯定类型
的,而是用到它的时候再肯定它是否知足这个类型的运行去肯定它具体的类型。回到上面的代码,咱们若是改为这样:变量
package main import "fmt" func main() { const a = 1 var b int32 = 2 fmt.Println(a + b) }
这时运行经过,运行的时候a
是 int32类型。那么是否是它之后一直是这一种类型呢,咱们看看下面的代码:数据类型
package main import "fmt" func main() { const a = 1 var b int32 = a var c int = a fmt.Println(a) fmt.Println(c) }
咱们能够看到c
和b
不是相同类型,但仍是能够把a
即赋值给b
也能够赋值给c
。也就是说只要是整数,不管是什么类型均可以参与运行。一样的道理,只要声明常量的时候没有指定类型,给它的赋值又是六种基本类型,常量均可以知足这个特性。im
iota
能够理解为一个特殊的常量,它只能和const
一块儿出现,并且只要const
出现它就会被重置为0
,而后每有一个常量被声明它就加1
package main import "fmt" func main() { const ( a = iota b c ) println(a, b, c) // 0 1 2 const ( d = iota e f ) fmt.Println(d, e, f) // 0 1 2 }
上面的a, b, c
的声明从0开始,每增长一行就加1。到d, e, f
以后因为出现了const
因此iota
又被重置为0
了。
iota
也能够在声明中参加运算,例如
const ( a = iota * 3 b c ) fmt.Println(a, b, c) // 0 3 6
下面一行保持和第一行相同的运行规则只是iota
加1
了,因此至关于b = 3 * 1