常量
- 使用const定义,类型可不指定
const Con string = "hello"
const Constr = "world"
func TestCon(t *testing.T){
//t.Log(getConNum())
t.Log(Con)
t.Log(Constr)
t.Log(reflect.TypeOf(Con))
}
- 常量可以是字符、字符串、布尔值或数值(整数型、浮点型和复数)
- 常量的值必须在编译时就能够确定
func getConNum() int {
return 1
}
const Con = getConNum()
func TestCon(t *testing.T){
//t.Log(getConNum())
t.Log(Con)
}
//result : const initializer getConNum() is not a constant
当然下面的代码是可以正常运行的,因为string实际上不是函数,而是关键字
const Con = string(65)
func TestCon(t *testing.T){
//t.Log(getConNum())
t.Log(Con)
}
//result : A
- 无类型数值常量可以在赋值时进行自动类型转化
const Conint = 1
func TestCon(t *testing.T){
var i8 int8 = Conint
var i64 int64 = Conint
t.Log(Conint)
t.Log(reflect.TypeOf(Conint))
t.Log(i8)
t.Log(reflect.TypeOf(i8))
t.Log(i64)
t.Log(reflect.TypeOf(i64))
}
//result: 1,int,1,int8,1,int64
//Conint = 1.1 => constant 1.1 truncated to integer
//Conint = 65536 => constant 65536 overflows int8
- 批量声明常量。
const (
a = 1
b
c = 1.1
d
)
func TestCon(t *testing.T){
t.Log(a,b,c,d)
t.Log(reflect.TypeOf(a))
t.Log(reflect.TypeOf(b))
t.Log(reflect.TypeOf(c))
t.Log(reflect.TypeOf(d))
}
//result 1,1,1.1,1.1
除了第一个外,其它的常量右边的初始化表达式都可以省略,如果省略初始化表达式则表示使用前面常量的初始化表达式,对应的常量类型也是一样的
- 常量允许定义后不使用
iota
在常量声明中,预声明的标识符
iota
表示连续的无类型整数。它的值为常量定义所在行的索引,从0开始计数。所以 也叫做常量计数器。
const (
c0 = iota // c0 == 0 iota = 0
c1 = -1 // c1 == -1 iota = 1(未使用)
c2,c3 = iota ,iota+2// c2 == 2 c3 == 2+2 iota = 2
c5 = iota // c5 == 4
)
const c6 = iota //iota = 0
func TestCon(t *testing.T){
t.Log(c0,c1,c2,c3,c5,c6)
}
- iota只能在const 定义时使用
func TestCon(t *testing.T){
t.Log(iota)
}
//result : undefined: iota
- 实现常量自增
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Partyday
)
func TestCon(t *testing.T){
t.Log(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Partyday)
}
- 实现常量移位
const (
Readable = 1 << iota
Writeable
Executable
)
func TestCon(t *testing.T){
t.Log(Readable,Writeable,Executable)
}
有疑问加站长微信联系(非本文作者)