Go 基础数据类型 常量生成器 iota

本文介绍了Go语言中常量的定义规则,包括全大写加下划线的命名规范,以及如何使用`const`声明常量。枚举类型的常量可以通过创建类型并初始化。此外,还讲解了`iota`常量生成器在创建一组连续常量时的作用,如定义一周的天数或位标志。常量在编译时计算,适合作为不变的配置值,并能参与编译时的运算和检查。
摘要由CSDN通过智能技术生成

常量命名


常量均需使用全部大写字母组成,并使用下划线分词 const APP_URL = "https://www.baidu.com" 如果是枚举类型的常量,需要先创建相应类型。

type Scheme string
const (
HTTP Scheme = "http"
HTTPS Scheme = "https"
)

常量定义


声明了 pi e 这两个常量之后,在整个程序运行期间它们的值都不能再发生变化了。

const pi = 3.1415
const e = 2.7182
// 多个常量也可以一起声明
const (
pi = 3.1415
e = 2.7182
)

const 同时声明多个常量时,如果省略了值则表示和上面一行的值相同。

const (
n1 = 100
n2
n3
)
// 上面示例中,常量 n1、n2、n3 的值都是 100

常量声明之后也可以不使用,这个和变量是有区别的。

常量的声明一般偏配置类型的,不太容易被改动的值。(如协议类型=HTTP/HTTPS)

常量表达式的值在编译期计算,而不是在运行期。每种常量的潜在类型都是基础类型:boolean、string或数字。

一个常量的声明语句定义了常量的名字,和变量的声明语法类似, 常量的值不可修改,这样可以防止在运行期被意外或恶意的修改。 例如,常量比变量更适合用于表达像π之类的数学常数,因为它们的值不会发生变化:
const pi = 3.14159 // approximately; math.Pi is a better approximation

和变量声明一样,可以批量声明多个常量;这比较适合声明一组相关的常量:

const ( 
e = 2.71828182845904523536028747135266249775724709369995957496696763 
pi = 3.14159265358979323846264338327950288419716939937510582097494459 
)

所有常量的运算都可以在编译期完成,这样可以减少运行时的工作,也方便其他编译优化。当操作数是常量时,一些运行时的错误也可以在编译时被发现,例如整数除零、字符串索引越界、任何导致无效浮点数的操作等。

常量间的所有算术运算、逻辑运算和比较运算的结果也是常量, 对常量的类型转换操作或以下函数调用都是返回常量结果:len、cap、real、imag、complex和unsafe.Sizeof。
 
因为它们的值是在编译期就确定的,因此常量可以是构成类型的一部分,例如用于指定数组类型的长度:

iota 常量生成器


常量声明可以使用iota常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。在一个const声明语句中,在第一个声明的常量所在的行,iota将会被置为0,然后在每一个有常量声明的行加一。

下面是来自time包的例子,它首先定义了一个Weekday命名类型,然后为一周的每天定义了一个常量,从周日0开始。在其它编程语言中,这种类型一般被称为枚举类型。
type Weekday int 
const ( 
   Sunday Weekday = iota 
   Monday 
   Tuesday 
   Wednesday 
   Thursday 
   Friday 
   Saturday 
)

周一将对应0,周一为1,如此等等。

我们也可以在复杂的常量表达式中使用iota,下面是来自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
	)
	fmt.Println(FlagUp,FlagBroadcast,FlagLoopback,FlagPointToPoint,FlagMulticast)


1 2 4 8 16

随着iota的递增,每个常量对应表达式1 << iota,是连续的2的幂,分别对应一个bit位置。使用这些常量可以用于测试、设置或清除对应的bit位的值:

下面是一个更复杂的例子,每个常量都是1024的幂:

不过iota常量生成规则也有其局限性。例如,它并不能用于产生1000的幂(KB、MB等),因为Go语言并没有计算幂的运算符。

常量定义


在GO语言里面常量大致和其他语言没有什么差别,在使用起来,唯一的一个差别就是Go语言可以快速的进行值的连续设置。 

与其他主要编程语⾔的差异:  快速设置连续值

 下面是定义一周七天,星期一值为1,星期二值为2,以此类推,下面通过简单方式生成,不需要一个一个依次赋值。

const (
 Monday = iota + 1
 Tuesday
 Wednesday
 Thursday
 Friday
 Saturday
 Sunday
)

更加酷的是可以对比特位常量进行连续赋值,比如下面使用每一位代表一种状态,比如第一个比特位为1,其他位为0对时候,表示open。然后第二位比特位为1时候其他位为0的时候表示close,第三位比特位为1,其他比特位为0的时候表示pending。

上面其实就是位运算。 

const (
 Open = 1 << iota
 Close
 Pending
)

下面就是做一个按位的与运算 

a := 7  //0111
     
fmt.Println(a&Open)


结果 1

位运算符

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值