在golang中处理常量列表
1 常量
常量间的所有算术运算、逻辑运算和比较运算的结果也是常量,对常量的类型转换操作或以下函数调用都是返回常量结果:
len、cap、real、imag、complex和、unsafe.Sizeof
一个常量的声明也可以包含一个类型和一个值,但是如果没有显式指明类型,那么将从右边的表达式推断类型。
2 iota 常量列表生成器
在 Golang 中,“iota”是一个预先声明的标识符,用于简化使用递增数字的常量定义,使您的代码更清晰、更易读。
这个概念乍一看似乎有点令人费解,但相信我,一旦你掌握了它的窍门,它就是一个非常方便的功能。
“iota”表示“const”块中从 0 开始的连续整数常数。它使定义枚举变得轻而易举,而无需手动为每个常量分配值。
通常在一个const声明语句中,在第一个声明的常量所在的行,iota将会被置为0,然后在每一个有常量声明的行加一。
使用“iota”不仅可以使您的代码更简洁,而且更易于维护。使用 ‘iota’,您不必手动更新所有后续常量。此功能可确保您的常数自动调整,从而减少出错的可能性并为您节省大量时间。
定义了一个Weekday命名类型,然后为一周的每天定义了一个常量,从周日0开始。在其它编程语言中,这种类型一般被称为枚举类型。
type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
表达式的枚举,下面是来自net包的例子,用于给一个无符号整数的最低5bit的每个bit指定一个名字
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位的值。
3 忽略某些常量的值
有时,您可能想要跳过一个值,甚至从不同的数字开始。以下是如何使用“iota”实现这一目标的方法。
const (
_ = iota // skip the zero value
January // 1
February // 2
March // 3
)
此代码片段演示如何使用下划线 ( _ ) 跳过值(在本例中为 0)。如果您需要常数从 1 开始或与此相关的任何其他值,这是一种忽略“iota”的第一个值的方法
“iota”的一个经典用例是创建一组位掩码标志。这在需要定义一组可以组合的选项的应用程序中很常见。
下例中每个常数都是 2 的幂,这是通过将 ‘iota’ 的当前值左移 1 来实现的。这对于创建一组选项来说是完美的,这些选项可以一起进行 OR 运转以组合多个标志
const (
Read = 1 << iota // 1
Write // 2
Execute // 4
)
这是一个更复杂的例子,每个常量都是1024的幂:
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 关键字、按位移位和带有 String() 方法的自定义类型声明的组合,该方法根据值的不同设置了不同的数据格式。
type ByteSize float64
const (
KB ByteSize = 1 << (10 * (iota + 1))
MB
GB
)
func (b ByteSize) String() string {
switch {
case b >= GB:
return fmt.Sprintf("%.2fGB", b/GB)
case b >= MB:
return fmt.Sprintf("%.2fMB", b/MB)
case b >= KB:
return fmt.Sprintf("%.2fKB", b/KB)
}
return fmt.Sprintf("%.2fB", b)
}
func main() {
fmt.Println(1001*KB, 2.5*MB, 3.5*GB)
fmt.Println(ByteSize(121000000))
}
不过iota常量生成规则也有其局限性。例如,它并不能用于产生1000的幂(KB、MB等),因为Go语言并没有计算幂的运算符。
使用 Golang 中的“iota”标识符完成的任务的表面。这一功能以其简单性和优雅性而著称,减少了样板代码并增强了可读性。我鼓励你尝试使用“iota”,尝试它的高级用法,看看它如何简化你的程序中的常数定义。
4 总结:
使用iota的优势有以下几个:
-
可读性:
常量使我们的代码更易于理解和清晰。通过使用有意义的名称而不是任意的值, 我们可以很容易地掌握它们的目的和意图。这改善了协作,并使代码维护更加容易。
-
避免使用幻数:
常量可以帮助我们避免使用“幻数”——没有明确上下文的硬编码值。 通过分配常量,我们为值提供有意义的名称,从而增强了代码的可维护性并减少了错误。
-
代码可重用性:
常量允许我们在代码的不同部分重用值。这样可以提高一致性,简化更新, 并确保相关代码段之间的同步。
-
编译时检查:
常量进行编译时检查,在开发过程的早期捕获错误。 这些检查有助于防止运行时错误并确保有效的分配。
-
灵活性和可伸缩性:
常量为我们的代码提供了灵活的基础。当需求发生变化时,我们可以轻松修改常量值, 而无需进行大量的代码修改。这确保了我们的代码能够有效地适应和扩展。
- 点赞
- 收藏
- 关注作者
评论(0)