Go_常量、iota(枚举)的使用

2023-05-16

常量

  • 常量是在程序运行过程中,其值不可以发生改变的数据,常量无法被获取地址

  • 常量中的数据类型能是布尔型、数字型(整型、浮点型和复数型)、字符串

  • 常量的定义是通过const关键字完成的,并且常量名称大写为公开,小写为私有,一般定义在函数外,定义在函数内属于局部常量

  • 常量和变量一样,可以省略数据类型,由编译器推断完成

常量的定义

const Name string = "不知火舞"
const Age = 99
const Address = "峡谷76号"

// 当常量比较多的时候可以使用常量块来表示,比较简洁
const (
	USERNAME = "干将莫邪"
	AGE      = 88
	ADDRESS  = "中路草丛"
)

// 也可以批量赋值
const name, age, address = "李白", 99, "峡谷野区草丛"

常量除不可以再次赋值外,和变量究竟有什么不同?

  • 常量不会分配存储空间,无需像变量那样通过内存地址取值,因此无法获取内存地址。

  • 常量值不能修改,变量可以

const NAME = "itzhuzhu"

func main() {
	NAME = "haha" // 报错,不能修改
}

函数内外都有相同常量时采用就近原则

const (
	USERNAME = "干将莫邪"
	AGE      = 88
	ADDRESS  = "中路草丛"
)

func main() {
	const USERNAME, AGE, ADDRESS = "itzhuzhu", 24, "中国"
	fmt.Println(USERNAME, AGE, ADDRESS) // 就近原则打印的是itzhuzhu
}

定义常量不使用不会报编译错误,不同作用域也可以定义相同常量

func main() {
	const X = 123
	fmt.Println("我是外面的:", &X)
	const Y = 1.23 //	未使用不会引发编译错误
	{
		const X = 321 //	不同作用域定义同名常量
		fmt.Println("我是里面的:", &X)
	}
}

常量值也可以是某些编译器能直接计算结果的表达式,如unsafe.Sizeof、len、cap等

func main() {
	const (
		ptrSize = unsafe.Sizeof(uintptr(0)) // 函数返回操作数在内存中的字节大小
		strSize = len("hello, world!")
	)
	fmt.Println(ptrSize)
	fmt.Println(strSize)
}

在常量组中如不指定类型和初始化值,则与上一行非空常量的值相同

func main() {
	const (
		X uint16 = 120
		Y        // 与上一行x类型、右值相同
		W = "abc"
		Z        // 与s类型、右值相同
	)
	fmt.Printf("%T, %v\n", Y, Y) // 输出类型和值
	fmt.Printf("%T, %v\n", Z, Z)
}

打印结果

uint16, 120
string, abc

显示常量和隐式定义常量区别,这里没搞懂为什么隐式不会做强类型检查

func main() {
	const x = 100     // 隐式无常量类型,值随便写
	const y byte = x  // 相当于const y byte = 100

	const a int = 100 // 显式指定常量类型,编译器会做强类型検查
	const b byte = a  // 错误:无法将 'a' (类型 int) 用作类型 byt
  const b byte = byte(a) // 只能通过强转
}

iota:

枚举就是将数据值一一列出来,枚举可以用来表示一些固定的值,枚举是常量组成的。在Go可以通过iota实现枚举的功能。

iota是Go语言的常量计数器,const出现时,会将iota初始化为0,const中每新增一行iota就会计数一次,递增默认数据类型为int

iota可以持续递增

	const (
		a = 1
		b = 2
		c = 3
	)

上面代码使用iota可以简化为

	const (
		a = iota // 第一行	重置为0	a:0
		b        // 第二行	新增1行	b:1
		c        // 第三行	新增1行	c:2
	)

自增默认类型为int,不过可显式指定常量类型

	const (
		a         = iota // int        iota = 0
		b float32 = iota // float32    iota = 1
		c                // float32    iota = 2
	)
	fmt.Println(a, b, c)
	fmt.Printf("%T\n%T\n%T\n", a, b, c)

_跳过当前常量值

	const (
		a = iota  // 0
		_         // 1
		c         // 2
		d         // 3
	)
	fmt.Println(a, c, d)

使用位移计算

	const (
		_  = iota             // 0
		KB = 1 << (10 * iota) // 1 << (10 * 1)
		MB                    // 1 << (10 * 2)
		GB                    // 1 << (10 * 3)
	)

如果中断iota递增,必须再次遇到iota才会恢复按行递增,否则将沿用上一次取值

const (
	a = 1 + iota // 第0行	重置为0	a = 1 + 0
	b            // 第1行	新增1行	b = 1 + 1
	c            // 第2行	新增1行	c = 1 + 2
	d = 4        // 第3行	新增1行	d = 4
	e            // 第4行	新增1行	e = 4   与上一行常量右值表达式相同
	f            // 第5行	新增1行	f = 4   只要不遇到iota,就一直是上次赋值的值,就是4
	g = iota     // 第6行	重置为0	g = 6	  这里遇到了iota,恢复iota自增,计数包括前面所有的常量
	i            // 第7行	新增1行	i = 7	  接着g+1,如果再定义常量初始化,就还是和4一样循环
	j            // 第8行	新增1行	i = 8	  
)

func main() {
	fmt.Println(a, b, c, d, e, f, g, i, j)
}

如果使用多个常量赋值的时候,后面的数据都会跟着第一行的格式走,直到下一个iota出现

const (
		a, b = 1 + iota, 2 + iota // iota = 0	a = iota + 1	b = iota + 2	a = 1 ,b = 2
		c, d                      // iota = 1	c = iota + 1	d = iota + 2	c = 2 ,d = 3
		e, f                      // iota = 2	e = iota + 1	f = iota + 2	e = 3 ,f = 4
		g, h = 3 + iota, 4 + iota // iota = 3	g = iota + 3	h = iota + 4	g = 6 ,h = 7
		i, j                      // iota = 4	i = iota + 3	j = iota + 4	i = 7 ,j = 8
)
fmt.Println(a, b, c, d, e, f, g, h, i, j)

可以自定义类型来实现用途明确的枚举类型。但须注意,这并不能将取值限定在预定义的枚举常量值范围内。

func main() {
	test(red)
	test(10000000) // 错误:10000000超出color/byte类型取值范围。
	x := 2
	test(x) // 错误:无法将 'x' (类型 int) 用作类型 color
}

type color byte // 自定义类型

const (
	black color = iota // 指定常量类型
	red
	blue
)

func test(c color) {
	fmt.Println(c)
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go_常量、iota(枚举)的使用 的相关文章

  • Docker 1 - 基本使用

    Docker 文章目录 Docker一 关于 Docker安装 Docker1 查看版本2 安装3 卸载 Docker 常见命令查看Docker 磁盘使用情况清理磁盘停止Docker 服务 二 镜像查看已安装镜像拉取镜像删除镜像查找镜像方式
  • Spring MVC的异常处理和友好页面

    加油 xff0c 新时代打工人 xff01 Spring MVC详细环境配置和入门 Spring MVC 响应数据和结果视图 SpringMVC实现三种文件上传的方式 实现之前把Spring MVC环境配置完成 xff0c 参考以上文章 S
  • oh-my-posh 配置

    官网 oh my poshpowershell windows 安装 oh my posh winget span class token function install span JanDeDobbeleer OhMyPosh 初始化设
  • matplotlib 点线动画

    matplotlib 点线动画 作者的Github 主写 Web Development HTML PHP CSS JS node js Ruby Sketchup API Python Tkinter Django Matplotlib
  • Ocelot+Identity Server

    一 搭建一个ID4 IdServer NetCore API 认证服务器项目 1 1 在该项目中添加Nuget包 vs2 1版本安装IdentityServer4 2 5 3版本 1 2 在ID4 IdServer项目中新建一个Config
  • twitter输不了密码_如何更改您的Twitter密码

    twitter输不了密码 You should use a strong password for every important web service you have While Twitter may not be up there
  • 不忘初心牢记使命文化励志标语墙贴——个性一百剪纸

    不忘初心牢记使命手工剪纸 个性一百定制服务中心 xff0c 可快速定制各类家居家具用品 工艺礼品 图案造型 xff0c 提供从构思到设计到制作一条龙服务 xff0c 您敢想我们敢做 不忘初心牢记使命绘画贴纸 我们不局限于某种商品 xff0c
  • 升级系统的curl命令到最新版

    1 安装repo rpm Uvh http www city fan org ftp contrib yum repo rhel6 x86 64 city fan org release 2 1 rhel6 noarch rpm 2 查看该
  • Mybatis TooManyResultsException问题可能原因及解决方案

    Mybatis TooManyResultsException问题可能原因及解决方案 可能原因 配置文件的对应语句中使用了resultType而非resultMap对应的interface中的返回值并非使用List数据库问题 解决方案 更改
  • 一键关机 / 重启脚本

    关机 span class token shebang important bin bash span span class token builtin class name echo span span class token strin
  • chromium报错: ./chrome: error while loading shared libraries: *** 解决方法

    注 xff1a 笔者所使用系统为Ubuntu2004 首先推荐一个神奇网站 此网站可查询ubuntu所有缺少包的安装方法 一口气装所有缺少的包 xff1a apt install y libatk1 0 0 libatk bridge2 0
  • ubuntu 获取root权限超简单方法

    以下解决上述问题 1 打开终端ctrl 43 alt 43 T输入 sudo s 2 重新设置root密码 3 切换root用户登录 su root 如果之后安装软件因为权限问题 xff0c 直接切换并输入密码即可
  • Java异常详解及自定义异常

    我已经不用 try catch 处理异常了 xff01 太烦人了 51CTO博客 try catch处理什么异常 一 异常的概念 1 定义 xff08 什么是异常 xff1f xff09 异常是例外 xff0c 是一个程序在执行期间发生的事
  • Archlinux 安装、美化、软件入门(一)

    本文章可能更新不及时 xff0c 前往我的博客阅读 xff0c 阅读体验更佳 xff1a https jin dan oier space 前言 本文只适用于 UEFI 引导 本文适用于从 Windows 迁移到 Archlinux 本文作
  • Archlinux 安装、美化、软件入门(二)

    本文章可能更新不及时 xff0c 前往我的博客阅读 xff0c 阅读体验更佳 xff1a https jin dan oier space 0x01 备份数据 使用 微PE 和 DiskGenius 工具进行数据备份和分区克隆 由于在 PE
  • Archlinux 安装、美化、软件入门(三)

    本文章可能更新不及时 xff0c 前往我的博客阅读 xff0c 阅读体验更佳 xff1a https jin dan oier space 0x03 安装系统 从U盘启动 待完善 连接Wi Fi xff08 有线用户直接跳过 xff09 输

随机推荐

  • 如何在笔记本电脑触摸板上进行中键单击

    Most laptop touchpads make it possible to perform a middle click but not all do In some situations you may need to enabl
  • Archlinux 安装、美化、软件入门(五)

    本文章可能更新不及时 xff0c 前往我的博客阅读 xff0c 阅读体验更佳 xff1a https jin dan oier space 0x07 系统美化 GRUB 美化 挑选喜欢的主题并下载 在 Gnome look 网站可以找到 G
  • 系统提示E: Unable to correct problems, you have held broken packages.错误解决

    系统提示E Unable to correct problems you have held broken packages 上网求答 xff0c 发现网上很多人选择用 aptitude xff0c 但是这个一般比较危险 xff0c 并不推
  • Linux kernel升级(详)

    环境 xff1a 系统版本 xff1a CentOS Linux release 7 4 1708 Core 内核版本 xff1a 3 10 0 693 el7 x86 64 内核由3 10升级5 4 升级说明 xff1a Linux Ke
  • stm32之蓝牙模块HC-05使用

    参考资料 xff1a 常用模块 HC 05蓝牙串口通信模块使用详解 xff08 实例 xff1a 手机蓝牙控制STM32单片机 xff09 HC 05蓝牙模块使用教程 HC 05蓝牙模块使用记录 补充与理解 xff1a 套餐有两个板子 一个
  • 2021-09-28->HttpClientUtil 工具包

    span class token keyword package span span class token namespace com span class token punctuation span ruoyi span class
  • 微信通知方法

    span class token comment 微信通知 span span class token function wxMessage span span class token punctuation span userId spa
  • 2021-09-29->微信支付

    接下来看微信支付jsapi接口是怎么调用的 步骤一 xff1a 获取微信支付四大参数 首先要想支持微信支付 必须拥有两个账号 微信公众平台 xff1a 账户 公众APPID xff0c APPSECEPT xff0c 微信商户平台商户ID
  • 20以为加减法

    span class token keyword for span span class token punctuation span span class token keyword int span i span class token
  • coturn服务配置

    COTURN服务配置 准备工作 一台带有公网ip的服务器 xff08 coturn服务部署在具有公网ip的服务器上 xff09 下载coturn wget https span class token operator span span
  • BigDecimal 精确算法 工具类

    BigDecimal a 61 new BigDecimal 101 BigDecimal b 61 new BigDecimal 111 使用compareTo方法比较 注意 xff1a a b均不能为null xff0c 否则会报空指针
  • wsappx_什么是“ wsappx”,为什么在我的PC上运行它?

    wsappx The wsappx process is part of Windows 8 and 10 and you may see it running in the background or even using a signi
  • python获取文件路径、文件夹内所有文件

    python获取文件路径 文件夹内所有文件名字 项目内相对路径 在test12 py内 想获取其所在文件夹的所有的表格文件 windows 第一种方案 34 34 34 获取路径 34 34 34 def list dir file dir
  • MySQL-常用内置函数(字符串、数值、日期、流程)

    字符串函数 xff1a 函数作用CONCAT str1 str2 拼接字符串 xff0c 返回拼接后的字符串LENGTH str 返回字符串字节长度 xff0c 注意是字节 xff0c 中文占3个LEFT str len 返回从最左边截取到
  • MySQL-基础语法DDL、DML、DQL、DCL

    DDL xff1a DDL Data Definition Language 数据库定义语言用来定义数据库对象 xff1a 数据库 xff0c 表 xff0c 列等 关键字 xff1a create drop alter 等 语法 DML语
  • VMware安装虚拟机Mac版

    VMware xff1a 1 不需要分区或重开机就能再同一台PC上使用多种操作系统 2 完全隔离并且保护不同操作系统的环境以及所有软件 资料 3 不同的操作系统之间还能互动操作 4 有复原功能 5 能够设置并且随时修改操作系统的操作环境 下
  • JSON转换工具

    JSON的处理 xff1a JSON JavaScript Object Notation xff1a 是一种轻量级的数据交换格式 它是基于 ECMAScript 规范的一个子集 xff0c 采用完全独立于编程语言的文本格式来存储和表示数据
  • MacOS Apple M1 安装ARM架构的JDK及动态切换版本

    JDK下载安装 xff1a 咱就是说 xff0c ARM版本的JDK就是一个字 xff0c 真特么快 xff0c 想变快吗 xff0c 赶紧下载叭 xff01 xff01 1 下载地址 xff1a https www azul com do
  • Go_详解TCP协议三次握手四次挥手

    三次握手 xff1a 三次握手表示建立通信阶段 xff0c 在TCP协议中 xff0c 在发送数据的准备阶段 xff0c 客户端与服务器之间的三次交互 xff0c 以保证连接的可靠 xff0c 由于这种面向连接的特性 xff0c TCP协议
  • Go_常量、iota(枚举)的使用

    常量 常量是在程序运行过程中 xff0c 其值不可以发生改变的数据 xff0c 常量无法被获取地址 常量中的数据类型能是布尔型 数字型 xff08 整型 浮点型和复数型 xff09 字符串 常量的定义是通过const关键字完成的 xff0c