From 1f2cbe492eebb15a758d74ea34ab07ffadce5d70 Mon Sep 17 00:00:00 2001 From: chai2010 Date: Mon, 21 Dec 2015 11:10:24 +0800 Subject: [PATCH] Update ch3-06-1.md --- ch3/ch3-06-1.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/ch3/ch3-06-1.md b/ch3/ch3-06-1.md index 77af911..af94161 100644 --- a/ch3/ch3-06-1.md +++ b/ch3/ch3-06-1.md @@ -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. + +