常量命名
常量均需使用全部大写字母组成,并使用下划线分词 const APP_URL = "https://www.baidu.com" 如果是枚举类型的常量,需要先创建相应类型。
type Scheme string
const (
HTTP Scheme = "http"
HTTPS Scheme = "https"
)
常量定义
声明了 pi 和 e 这两个常量之后,在整个程序运行期间它们的值都不能再发生变化了。
const pi = 3.1415
const e = 2.7182
// 多个常量也可以一起声明
const (
pi = 3.1415
e = 2.7182
)
const 同时声明多个常量时,如果省略了值则表示和上面一行的值相同。
const (
n1 = 100
n2
n3
)
// 上面示例中,常量 n1、n2、n3 的值都是 100
常量声明之后也可以不使用,这个和变量是有区别的。
常量的声明一般偏配置类型的,不太容易被改动的值。(如协议类型=HTTP/HTTPS)
常量表达式的值在编译期计算,而不是在运行期。每种常量的潜在类型都是基础类型:boolean、string或数字。
const pi = 3.14159 // approximately; math.Pi is a better approximation
和变量声明一样,可以批量声明多个常量;这比较适合声明一组相关的常量:
const (
e = 2.71828182845904523536028747135266249775724709369995957496696763
pi = 3.14159265358979323846264338327950288419716939937510582097494459
)
所有常量的运算都可以在编译期完成,这样可以减少运行时的工作,也方便其他编译优化。当操作数是常量时,一些运行时的错误也可以在编译时被发现,例如整数除零、字符串索引越界、任何导致无效浮点数的操作等。
iota 常量生成器
常量声明可以使用iota常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。在一个const声明语句中,在第一个声明的常量所在的行,iota将会被置为0,然后在每一个有常量声明的行加一。
type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
周一将对应0,周一为1,如此等等。
type Flags uint
const (
FlagUp Flags = 1 << iota // is up
FlagBroadcast // supports broadcast access capability
FlagLoopback // is a loopback interface
FlagPointToPoint // belongs to a point-to-point link
FlagMulticast // supports multicast access capability
)
fmt.Println(FlagUp,FlagBroadcast,FlagLoopback,FlagPointToPoint,FlagMulticast)
1 2 4 8 16
随着iota的递增,每个常量对应表达式1 << iota,是连续的2的幂,分别对应一个bit位置。使用这些常量可以用于测试、设置或清除对应的bit位的值:
不过iota常量生成规则也有其局限性。例如,它并不能用于产生1000的幂(KB、MB等),因为Go语言并没有计算幂的运算符。
常量定义
在GO语言里面常量大致和其他语言没有什么差别,在使用起来,唯一的一个差别就是Go语言可以快速的进行值的连续设置。
与其他主要编程语⾔的差异: 快速设置连续值
下面是定义一周七天,星期一值为1,星期二值为2,以此类推,下面通过简单方式生成,不需要一个一个依次赋值。
const (
Monday = iota + 1
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
)
更加酷的是可以对比特位常量进行连续赋值,比如下面使用每一位代表一种状态,比如第一个比特位为1,其他位为0对时候,表示open。然后第二位比特位为1时候其他位为0的时候表示close,第三位比特位为1,其他比特位为0的时候表示pending。
上面其实就是位运算。
const (
Open = 1 << iota
Close
Pending
)
下面就是做一个按位的与运算
a := 7 //0111
fmt.Println(a&Open)
结果 1
位运算符