在golang中处理常量列表

举报
码乐 发表于 2024/07/28 06:27:17 2024/07/28
【摘要】 1 常量常量间的所有算术运算、逻辑运算和比较运算的结果也是常量,对常量的类型转换操作或以下函数调用都是返回常量结果:len、cap、real、imag、complex和、unsafe.Sizeof一个常量的声明也可以包含一个类型和一个值,但是如果没有显式指明类型,那么将从右边的表达式推断类型。 2 iota 常量列表生成器在 Golang 中,“iota”是一个预先声明的标识符,用于简...

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的优势有以下几个:

  • 可读性:

      常量使我们的代码更易于理解和清晰。通过使用有意义的名称而不是任意的值,
     我们可以很容易地掌握它们的目的和意图。这改善了协作,并使代码维护更加容易。
    
  • 避免使用幻数:

      常量可以帮助我们避免使用“幻数”——没有明确上下文的硬编码值。
     通过分配常量,我们为值提供有意义的名称,从而增强了代码的可维护性并减少了错误。
    
  • 代码可重用性:

      常量允许我们在代码的不同部分重用值。这样可以提高一致性,简化更新,
      并确保相关代码段之间的同步。
    
  • 编译时检查:

          常量进行编译时检查,在开发过程的早期捕获错误。
          这些检查有助于防止运行时错误并确保有效的分配。
    
  • 灵活性和可伸缩性:

      常量为我们的代码提供了灵活的基础。当需求发生变化时,我们可以轻松修改常量值,
      而无需进行大量的代码修改。这确保了我们的代码能够有效地适应和扩展。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。