1常量
package main
import "fmt"
func main() {
// 1. 常量的数据类型可以是数字,字符串,布尔
// 2. 不曾使用的常量,编译时不会报错,变量会报错
// 常量定义
// 1. 省略类型
// 2. 定义多个常量(类型相同)
// 3. 定义多个常量(类型不同)
// 4. 定义多个常量,省略类型
const aaa = 1
const (
bbb = 1
ccc = 1
ddd, eee = "ddd", "eee"
fff, ggg = 100, "ggg"
hhh int = 10
iii string = "iii"
//j string // 常量不能只声明不赋值
)
// 常量组如不指定类型和初始化值,该类型和值和上一行的类型一致
const (
x int = 16
y
s = "abc"
z
)
fmt.Println(x, y, s, z) // 16 16 abc abc
fmt.Printf("%T %T %T %T\n", x, y, s, z) // int int string string
// Go没有枚举类型,可以通过常量和枚举关键字实现枚举效果,枚举关键字:iota
// iota是常量,常用作常量计数器,枚举,只和行有关
// 几十个计数器,是第几个常量,从0开始
const (
a = iota //0
b //1
c //2
d = "ha" //独立值,07-iota += 1 = 3
e //"ha" 07-iota += 1 = 4
f = 100 //100 07-iota +=1 = 5
g //100 07-iota +=1 = 6
h, i = iota, iota //7, 7 07-iota + 1 = 7
j = iota //8 恢复计数 ==> 8
//k //9
//l //10
)
fmt.Println(a, b, c, d, e, f, g, h, i, j) // 0 1 2 ha ha 100 100 7 7 8 9 10
const (
aa = iota // 0
bb = iota // 1
cc = iota // 2
)
fmt.Println(aa, bb, cc) // 0 1 2
// 下面的这个要注意下,B1值是200
const (
A1 = (iota + 1) * 100 // 100
B1 // 200
C1 // 300
D1 = 10 //10
E1 = "hello" // hello
F1 // hello
G1 = iota // 6
)
fmt.Println(A1, B1, C1, D1, E1, F1, G1) // 100 200 300 10 hello hello 6
}
常量是一个简单值的标识符,在程序运行时,不会被修改的量。 显式类型定义: const b string = “abc” 隐式类型定义: const b = “abc”
package main
import “fmt”
func main() {
const LENGTH int = 10
const WIDTH int = 5
var area int
const a, b, c = 1, false, “str” //多重赋值
area = LENGTH * WIDTH
fmt.Printf(“面积为 : %d”, area)
fmt.Println(a, b, c)
}
常量可以作为枚举,常量组
const (
Unknown = 0
Female = 1
Male = 2
)
常量组合python中元组类似,一旦定义不能被修改
gender_tuple = (“male”, “female”)
gender_tuple[0] = “unknown” # 这一行会报错,不支持修改
go 常量组中不能重复定义,下面第3,5行会报错,提示 'male' redeclared in this block
const (
unknown = 0
male = 1
female = 2
male = 3
)
常量组中如不指定类型和初始化值,则与上一行非空常量右值相同,该类型和值与上一行的类型一致 package main
import ( “fmt” )
func main() { const ( x uint16 = 16 y s = “abc” z ) fmt.Printf("%T,%v\n", y, y) // uint16,16 fmt.Printf("%T,%v\n", z, z) // string,abc } 常量的注意事项: ● 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型 ● 不曾使用的常量,在编译的时候,是不会报错的,但是变量不行,变量一旦定义就必须使用 ● 显示指定类型的时候,必须确保常量左右值类型一致,需要时可做显示类型转换。这与变量就不一样了,变量可以是不同的类型值 iota iota,特殊常量,可以认为是一个可以被编译器修改的常量 iota 可以被用作枚举值: const ( a = iota // 0 b = iota // 1 c = iota // 2 ) 第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式: const ( a = iota b c ) package main
import “fmt”
func main() { const ( a = iota //0 b //1 c //2 d = “ha” //独立值,iota += 1 e //“ha” iota += 1 f = 100 //iota +=1 g //100 iota +=1 h,i=iota j = iota //7,恢复计数 k //8 ) fmt.Println(a, b, c, d, e, f, g, h, i, j, k) // 0 1 2 ha ha 100 100 7 8 }
如果中断iota自增,则必须显式恢复。且后续自增值按行序递增 自增默认是int类型,可以自行进行显示指定类型 数字常量不会分配存储空间,无须像变量那样通过内存寻址来取值,因此无法获取地址
使用iota能简化定义,在定义枚举时很有用。
每次 const 出现时,都会让 iota 初始化为0. const a = iota // a=0 const ( b = iota //b=0 c //c=1 相当于c=iota )