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

常量

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

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

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

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

常量的定义

const Name string = "不知火舞"
const Age = 99
const Address = "峡谷76号"
const name, age, address = "李白", 99, "峡谷野区草丛"// 当常量比较多的时候可以使用常量块来表示,比较简洁
const (USERNAME = "干将莫邪"AGE      = 88ADDRESS  = "中路草丛"
)// 也可以批量赋值
const GENDER, HOBBY = "男", "黑丝"

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

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

  • 常量值不能再次改变,变量可以

const NAME = "itzhuzhu"func main() {NAME = "haha" // 报错
}

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

const (USERNAME = "干将莫邪"AGE      = 88ADDRESS  = "中路草丛"
)func main() {const USERNAME, AGE, ADDRESS = "itzhuzhu", 24, "中国"fmt.Println(USERNAME, AGE, ADDRESS) // 就近原则打印的是itzhuzhu
}

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

func main() {const X = 123fmt.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 = 120Y        // 与上一行x类型、右值相同S = "abc"Z        // 与s类型、右值相同)fmt.Printf("%T, %v\n", Y, Y) // 输出类型和值fmt.Printf("%T, %v\n", Z, Z)
}

打印结果

uint16, 120
string, abc

显示常量和隐式定义常量区别,这里没搞懂原因,x默认是int类型,int转给byte,也没有做强转

func main() {const x = 100     // 隐式无常量类型,值随便写const y byte = x  // 相当于const y byte = 100const a int = 100 // 显式指定常量类型,编译器会做强类型検查const b byte = a  // 错误:无法将 'a' (类型 int) 用作类型 byt
}

那为什么隐式的可以赋值,显示的不能赋值呢?

iota:

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

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

iota可以持续递增

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

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

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

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

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

_跳过值

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

使用位移计算

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

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

const (a = 1 + iota // 第0行	重置为0	a = 1 + 0b            // 第1行	新增1行	b = 1 + 1c            // 第2行	新增1行	c = 1 + 2d = 4        // 第3行	新增1行	d = 4e            // 第4行	新增1行	e = 4   与上一行常量右值表达式相同f            // 第5行	新增1行	f = 4   只要不遇到iota,就一直是上次赋值的值,就是4g = 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 = 2c, d                      // iota = 1	c = iota + 1	d = iota + 2	c = 2 ,d = 3e, f                      // iota = 2	e = iota + 1	f = iota + 2	e = 3 ,f = 4g, h = 3 + iota, 4 + iota // iota = 3	g = iota + 3	h = iota + 4	g = 6 ,h = 7i, 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 := 2test(x) // 错误:无法将 'x' (类型 int) 用作类型 color
}type color byte // 自定义类型const (black color = iota // 指定常量类型redblue
)func test(c color) {fmt.Println(c)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pthon_函数式编程与面向对象编程的比较

函数式编程作为结构化编程的一种&#xff0c;正在受到越来越多的重视。工程中不在只是面向对象编程&#xff0c;更多的人尝试着开始使用函数式编程来解决软件工程中遇到的问题。 什么是函数式编程&#xff1f;在维基百科中给出了详细的定义&#xff0c;函数式编程&#xff08;英…

Go_方法、方法重载

方法&#xff1a; 方法是绑定在自定义类型上的&#xff0c;常用在结构体上 方法只能通过绑定的自定义类型的变量来调用&#xff0c;方法不能直接调用&#xff0c;因为方法是和类型作关联的 方法是值拷贝的传递方式&#xff0c;如果希望改变结构体变量的值&#xff0c;需要通过…

go_命令行参数Args、flag

Args&#xff1a; os.Args是一个string的切片&#xff0c;可以存储所有的命令行参数&#xff08;在终端运行才行&#xff09;&#xff0c; func main() {args : os.Argsfor i, v : range args {fmt.Println("索引&#xff1a;", i, "\t数据&#xff1a;"…

防止sql注入的方法

防止sql注入从前端的页面到后台可以分为以下几个办法&#xff1a; 1.在前端页面就可以用js过滤数据 要引入的包&#xff1a; import Java.util.regex.*; 正则表达式&#xff1a; private String CHECKSQL “^(.)\\sand\\s(.)|(.)\\sor(.)\\s$”; 判断是否匹配&#xff1a; Pat…

使用haystack实现django全文检索搜索引擎功能

前言 django是python语言的一个web框架&#xff0c;功能强大。配合一些插件可为web网站很方便地添加搜索功能。 搜索引擎使用whoosh&#xff0c;是一个纯python实现的全文搜索引擎&#xff0c;小巧简单。 中文搜索需要进行中文分词&#xff0c;使用jieba。 直接在django项目中使…

Go_输入与输出

输出的几种方式&#xff1a; fmt.Print&#xff1a;属于标准输出流&#xff0c;一般使用它来进行屏幕输出&#xff0c;但它不能换行fmt.Printf&#xff1a;可以格式化输出&#xff0c;输出不换行fmt.Println&#xff1a;输出后换行fmt.Sprint&#xff1a;返回一个格式化的字符…

3、事件响应函数(一)

一、激活销毁 void OnEnable()//每次激活脚本时调用{print("OnEnable");}void OnDisable()//脚本取消激活状态调用{print("OnDisable");}void OnDestroy()//被销毁时调用{print("OnDestroy");} 二、鼠标事件 /// <summary>/// 代码添加到需…

人人都是产品经理?

产品经理顾名思义就是产品经理。那么只要搞懂产品是什么、经理又什么什么&#xff0c;就明白了产品经理是什么。 产品是什么&#xff1a; 产品是满足需求的载体&#xff0c;能被市场、人们使用和消费&#xff0c;并能满足人们某种需求&#xff08;创造价值&#xff09;的任何东…

搭建一个简单的FTP服务器

本文介绍通过win7自带的IIS来搭建一个只能实现基本功能的FTP服务器&#xff0c;第一次装好WIN7后我愣是没整出来&#xff0c;后来查了一下网上资料经过试验后搭建成功&#xff0c;其实原理和步骤与windows前期的版本差不多&#xff0c;主要是对新的操作系统还不是很熟悉。相信用…

3D文档(BRD、MRD、PRD)怎么写

3D文档&#xff1a; 一般来说&#xff0c;BRD作为战略方向的制定&#xff0c;是最早产出的文档&#xff0c;而MRD则是在战略方向的基础上对市场进行的分析&#xff0c;同时对后续工作的方向进行一些说明和指导&#xff0c;也可以说是通过对市场环境、竞品的分析&#xff0c;明确…

需求收集、分析、管理的方法

需求&#xff1a; 什么是需求 百度百科给的解释&#xff1a;指人们在某一特定的时期内在各种可能的价格下愿意并且能够购买某个具体商品的需要。所以要想明白需求&#xff0c;还要明白另外两个概念&#xff0c;需要和欲望&#xff0c;因为从需要到需求是一个由宏观到微观的过程…

Oracle中start with...connect by子句的用法

connect by 是结构化查询中用到的&#xff0c;其基本语法是&#xff1a;select … from tablenamestart with 条件1connect by 条件2where 条件3;例&#xff1a;select * from tablestart with org_id ‘HBHqfWGWPy’connect by prior org_id parent_id;简单说来是将一个树状…

用户访谈与问卷调查怎么做

用户访谈&#xff1a; 用提问交流的方式&#xff0c;了解用户体验的过程&#xff0c;访谈内容需要根据访谈目的来确定&#xff0c;通常包括产品的使用过程、使用感受、品牌印象等&#xff0c;属于定性研究。 访谈场景&#xff1a; 接听客服电话&#xff08;轮岗&#xff0c;客服…

【hdu2825】ac自动机 + 状压dp

传送门 题目大意&#xff1a; 给你一些密码片段字符串&#xff0c;让你求长度为n&#xff0c;且至少包含k个不同密码片段串的字符串的数量。 题解&#xff1a; 因为密码串不多&#xff0c;可以考虑状态压缩 设dp[i][j][sta]表示长为i的字符串匹配到j节点且状态为sta的数量。 其…

if函数 字体自动标红_发喜糖!REPT函数和图表订婚了~~

小伙伴们早上好呀&#xff01;今天为大家分享的是REPT函数的应用实例。案例1&#xff1a;基础用法左右&#xff1a;按照给定的次数重复显示文本用法&#xff1a;REPT(文本&#xff0c;重复次数)搭配&#xff1a;Wingdings字体家族的应用案例2&#xff1a;条形图⑴ 单元格D3输入…

用户体验五要素

用户体验&#xff1a; 用户在使用产品过程中建立起来的一种纯主观感受。 用户体验的重要性&#xff1a; 会失去客户&#xff1a;如果你没有良好的体验&#xff0c;用户不会使用你的产品&#xff0c;而且产品很难有二次机会接触用户。会增加获客成本&#xff1a;获客成本越来越高…

用鼠标旋转图像

这里涉及的到图像旋转后&#xff0c;方向的计算。我也不是很明白。先记录下来再说。 #_*_coding:utf-8 _*_import pygame from pygame.locals import * from sys import exit from gameobjects.vector2 import Vector2 from math import *background_image_filename./images/se…

trackingmore快递查询平台_国际快递物流信息追踪查询

以下是快递公司常用查询物流信息追踪平台1. 17TRACK查询网址&#xff1a;www.17track.net/zh-cn (强烈推荐&#xff0c;国际件都能查询)2. EMS查询网址&#xff1a;www.ems.com.cn 客服电话&#xff1a;11833. DHL网址查询&#xff1a;www.cn.dhl.com …

竞品分析该怎么做

竞品分析&#xff1a; 作用&#xff1a; 知己知彼&#xff0c;百战不殆。为自身产品设计提供功能、可用性、关键技术等方面的参考。提高自身产品的差异化程度。为新立项的产品、拍脑袋想出来的&#xff0c;降低风险。 如何选择竞品&#xff1a; 行业内领先的产品&#xff0c;通…

饿了么超时20分钟_饿了么回应“多等5分钟”,网友气炸了

广告记编辑整理(ID&#xff1a;adgroup)昨天一篇题为《外卖骑手&#xff0c;困在系统里》的文章刷屏文章指出外卖骑手是被平台系统算法与数据支配的“工具人”在系统的压迫下骑手们每天都在违反交规、与死神赛跑外卖员成了高危职业引发网友热议今天凌晨饿了么官方发布了一篇《你…