mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2024-12-25 06:18:56 +00:00
Update ch3-06-1.md
This commit is contained in:
parent
0b1d5f32bc
commit
1f2cbe492e
@ -1,3 +1,79 @@
|
||||
### 3.6.1. iota 常量生成器
|
||||
|
||||
TODO
|
||||
|
||||
常量声明可以使用 iota 常量生成器, 用于生成一组相似的常量值, 但是不用每行都写一遍. 在一个 const 声明语句中, 在开始一行 iota 将会被置为0, 然后在每一个有常量声明的行加一.
|
||||
|
||||
下面是来自 time 包的例子, 它首先定义了Weekday命名类型, 然后为一周的每天定义一个常量, 从周日0开始. 这种类型一般被称为枚举类型.
|
||||
|
||||
```Go
|
||||
type Weekday int
|
||||
|
||||
const (
|
||||
Sunday Weekday = iota
|
||||
Monday
|
||||
Tuesday
|
||||
Wednesday
|
||||
Thursday
|
||||
Friday
|
||||
Saturday
|
||||
)
|
||||
```
|
||||
|
||||
周一将对应0, 周一为1, 如此等等.
|
||||
|
||||
我们也可以在复杂的常量表达式中使用 iota, 下面是来自 net 包的例子, 用于给一个无符号整数的最低5bit的每个bit给定一个名字:
|
||||
|
||||
```Go
|
||||
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
|
||||
)
|
||||
```
|
||||
|
||||
随着 iota 的递增, 每个常量对应表达式 1 << iota, 是连续的2的幂, 分别对应一个bit位置. 使用这些常量可以测试, 设置, 或清除对应的bit位的值:
|
||||
|
||||
```Go
|
||||
gopl.io/ch3/netflag
|
||||
|
||||
func IsUp(v Flags) bool { return v&FlagUp == FlagUp }
|
||||
func TurnDown(v *Flags) { *v &^= FlagUp }
|
||||
func SetBroadcast(v *Flags) { *v |= FlagBroadcast }
|
||||
func IsCast(v Flags) bool { return v&(FlagBroadcast|FlagMulticast) != 0 }
|
||||
|
||||
unc main() {
|
||||
var v Flags = FlagMulticast | FlagUp
|
||||
fmt.Printf("%b %t\n", v, IsUp(v)) // "10001 true"
|
||||
TurnDown(&v)
|
||||
fmt.Printf("%b %t\n", v, IsUp(v)) // "10000 false"
|
||||
SetBroadcast(&v)
|
||||
fmt.Printf("%b %t\n", v, IsUp(v)) // "10010 false"
|
||||
fmt.Printf("%b %t\n", v, IsCast(v)) // "10010 true"
|
||||
}
|
||||
```
|
||||
|
||||
下面是一个更复杂的例子, 每个常量都是1024的幂:
|
||||
|
||||
```Go
|
||||
const (
|
||||
_ = 1 << (10 * iota)
|
||||
KiB // 1024
|
||||
MiB // 1048576
|
||||
GiB // 1073741824
|
||||
TiB // 1099511627776 (exceeds 1 << 32)
|
||||
PiB // 1125899906842624
|
||||
EiB // 1152921504606846976
|
||||
ZiB // 1180591620717411303424 (exceeds 1 << 64)
|
||||
YiB // 1208925819614629174706176
|
||||
)
|
||||
```
|
||||
|
||||
iota 机制也有其局限性. 例如, 它并不能用于产生1000的幂(KB,MB,等等), 因为并没有计算幂的运算符.
|
||||
|
||||
**练习3.13:** 编写KB,MB的常量声明, 然后扩展到YB.
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user