Go语言编程(五)之常量

释放双眼,带上耳机,听听看~!

   在Go语言中,常量是指编译期间就已知且不可改变的值。常量可以是数值类型(包括整型、浮点型和复数类型)、布尔类型、字符串类型等。

字面常量

是指程序中硬编码的常量。Go语言的字面常量是无类型的。只要这个常量在相应类型的值域范围内,就可以作为该类型的常量。

常量定义

通过const关键字,可以给字面常量指定一个友好的名字:


1
2
1const Pi float64 = 3.1415926
2

1
2
1const zero = 0.0                // 无类型浮点常量
2

1
2
1const (
2

1
2
1    size int64 = 1024
2

1
2
1    eof = -1                    // 无类型整型常量
2

1
2
1)
2

1
2
1const u, v float32 = 0, 3       // u = 0.0, v = 3.0,常量的多重赋值
2

1
2
1const a, b, c = 3, 4, "foo"     // 无类型整型和字符串常量
2

Go的常量定义可以限定常量类型,但不是必需的。如果定义常量时没有指定类型,那么它与字面常量一样,是无类型常量。
常量定义的右值也可以是一个在编译期运算的常量表达式,比如const mask = 1 << 3
由于常量的赋值是一个编译期行为,所以右值不能出现任何需要运行期才能得出结果的表达式,比如试图以如下方式定义常量就会导致编译错误:
const Home = os.GetEnv("HOME")

原因很简单,os.GetEnv()只有在运行期才能知道返回结果,在编译期并不能确定,所以无法作为常量定义的右值。

预定义常量

Go语言预定义了这些常量:true、false、iota

iota比较特殊,可以被认为是一个可被编译器修改的常量,在每一个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1.

从以下的例子可以理解iota的用法:


1
2
1const ( // iota  reset to 0
2

1
2
1    c0 = iota // c0 == 0
2

1
2
1    c1 = iota // c1 == 1
2

1
2
1    c2 = iota // c2 == 2
2

1
2
1)
2

1
2
1const (
2

1
2
1    a = 1 &lt;&lt; iota // a == 1
2

1
2
1    b = 1 &lt;&lt; iota // b == 2
2

1
2
1    c = 1 &lt;&lt; iota // c == 4
2

1
2
1)
2

1
2
1const (
2

1
2
1    u         = iota * 42 // u == 0
2

1
2
1    v float64 = iota * 42 // v == 42.0
2

1
2
1    w         = iota * 42 // w == 84
2

1
2
1)
2

1
2
1const x = iota // x == 0
2

1
2
1const y = iota // y == 0
2

1
2
1 如果两个const的赋值语句的表达式是一样的,那么可以省略后一个赋值表达式。因此,上面前两个const语句可简写为:
2

1
2
1const (
2

1
2
1    c0 = iota
2

1
2
1    c1
2

1
2
1    c2
2

1
2
1)
2

1
2
1const (
2

1
2
1    a = 1 &lt;&lt; iota
2

1
2
1    b
2

1
2
1    c
2

1
2
1)
2

枚举

枚举指一系列相关的常量。Go语言中我们可以用在const后跟一对圆括号的方式定义一组常量。


1
2
1const (
2

1
2
1    Sunday = iota
2

1
2
1    Monday
2

1
2
1    Tuesday
2

1
2
1    Wednesday
2

1
2
1    Thursday
2

1
2
1    Friday
2

1
2
1    Saturday
2

1
2
1    numberOfDays
2

1
2
1)
2

1
2
1 同Go语言的其他符号(symbol)一样,以大写字母开头的常量在包外可见。
2

以上例子中numberOfDays为包内私有,其他符号则可被其他包访问。

给TA打赏
共{{data.count}}人
人已打赏
安全技术

C++中引用和指针的区别

2022-1-11 12:36:11

安全技术

Go语言系列(十一)之依赖管理

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索