常量
-
常量是在程序运行过程中,其值不可以发生改变的数据
,常量无法被获取地址
-
常量中的数据类型能是布尔型、数字型(整型、浮点型和复数型)、字符串
-
常量的定义是通过const
关键字完成的,并且常量名称大写为公开,小写为私有,一般定义在函数外,定义在函数内属于局部常量
-
常量和变量一样,可以省略数据类型,由编译器推断完成
常量的定义
const Name string = "不知火舞"
const Age = 99
const Address = "峡谷76号"
const (
USERNAME = "干将莫邪"
AGE = 88
ADDRESS = "中路草丛"
)
const name, age, address = "李白", 99, "峡谷野区草丛"
常量除不可以再次赋值外,和变量究竟有什么不同?
const NAME = "itzhuzhu"
func main() {
NAME = "haha"
}
函数内外都有相同常量时采用就近原则
const (
USERNAME = "干将莫邪"
AGE = 88
ADDRESS = "中路草丛"
)
func main() {
const USERNAME, AGE, ADDRESS = "itzhuzhu", 24, "中国"
fmt.Println(USERNAME, AGE, ADDRESS)
}
定义常量不使用不会报编译错误,不同作用域也可以定义相同常量
func main() {
const X = 123
fmt.Println("我是外面的:", &X)
const Y = 1.23
{
const X = 321
fmt.Println("我是里面的:", &X)
}
}
常量值也可以是某些编译器能直接计算结果的表达式,如unsafe.Sizeof、len、cap等
func main() {
const (
ptrSize = unsafe.Sizeof(uintptr(0))
strSize = len("hello, world!")
)
fmt.Println(ptrSize)
fmt.Println(strSize)
}
在常量组中如不指定类型和初始化值,则与上一行非空常量的值相同
func main() {
const (
X uint16 = 120
Y
W = "abc"
Z
)
fmt.Printf("%T, %v\n", Y, Y)
fmt.Printf("%T, %v\n", Z, Z)
}
打印结果
uint16, 120
string, abc
显示常量和隐式定义常量区别,这里没搞懂为什么隐式不会做强类型检查
func main() {
const x = 100
const y byte = x
const a int = 100
const b byte = a
const b byte = byte(a)
}
iota:
枚举就是将数据值一一列出来,枚举可以用来表示一些固定的值,枚举是常量组成的。在Go可以通过iota实现枚举的功能。
iota是Go语言的常量计数器,const出现时,会将iota初始化为0,const中每新增一行iota就会计数一次,递增默认数据类型为int
iota可以持续递增
const (
a = 1
b = 2
c = 3
)
上面代码使用iota可以简化为
const (
a = iota
b
c
)
自增默认类型为int,不过可显式指定常量类型
const (
a = iota
b float32 = iota
c
)
fmt.Println(a, b, c)
fmt.Printf("%T\n%T\n%T\n", a, b, c)
_跳过当前常量值
const (
a = iota
_
c
d
)
fmt.Println(a, c, d)
使用位移计算
const (
_ = iota
KB = 1 << (10 * iota)
MB
GB
)
如果中断iota递增,必须再次遇到iota才会恢复按行递增,否则将沿用上一次取值
const (
a = 1 + iota
b
c
d = 4
e
f
g = iota
i
j
)
func main() {
fmt.Println(a, b, c, d, e, f, g, i, j)
}
如果使用多个常量赋值的时候,后面的数据都会跟着第一行的格式走,直到下一个iota出现
const (
a, b = 1 + iota, 2 + iota
c, d
e, f
g, h = 3 + iota, 4 + iota
i, j
)
fmt.Println(a, b, c, d, e, f, g, h, i, j)
可以自定义类型来实现用途明确的枚举类型。但须注意,这并不能将取值限定在预定义的枚举常量值范围内。
func main() {
test(red)
test(10000000)
x := 2
test(x)
}
type color byte
const (
black color = iota
red
blue
)
func test(c color) {
fmt.Println(c)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)