【go入门】常量
目录
- 定义
- 枚举
- iota
- 思考题
定义
go语言常量的定义和其他语言类似,常量中的数据类型只能是布尔型,数字型(整型、浮点型、复数)和字符串型
常量的定义方式和变量一样,只不过变量定义使用 var 关键字,而常量定义是使用 const 关键字:
//常量的定义方式
const a string = "hello"
同样,类型也可以省略,编译器会根据值来判断类型:
const a = "hello"
多个相同类型的常量声明:
const a, b = 1, 2
枚举
在C++中,由专门的枚举类型关键字enum,在go语言中则用常量表示枚举:
const (fruit = 0vegetable = 1
)
数字 0 代表水果,数字 1 代表蔬菜
//demo1
package mainimport ("fmt""unsafe"
)const (a = "hello"b = len(a) //长度c = unsafe.Sizeof(a) //字节数
)func main() {fmt.Println(a, b, c)
}
结果是:
hello 5 16
为什么 unsafe.Sizeof() 是 16 呢?
实际上,只要是字符串类型它都是 16。
因为字符串类型对应一个结构体,该结构体有两个域,一个是指向字符串的指针,一个是字符串的长度,每个域都占 8 个字节,但是不包含指针指向的字符串的内容,也就是说字符串里你放 3 个字符和 5 个字符最终都占 16 个字节。
把上面说的结构体可以看成:
typedef struct {char* buffer; //指向该字符串的指针占 8 个字节size_tlen; //字符串的长度占 8 个字节
} String;
第二个域字符串的长度占 8 个字节,哪怕这个字符串的长度是 0,它也占 8 个字节。可以想象一下,假设一个教室里面有 n 个座位,这 n 个座位不管坐多少个人,哪怕没有一个人,这些座位仍然把教室的空间占着。除非把教室拆了,同理创建字符串的时候空间已经占用了,无论里面有没有东西。
iota
iota 是一个特殊常量。可以认为是一个能被编译器修改的常量
iota 在 const 关键字出现时将被重置为 0,const 中每新增一行常量声明将使 iota 增加 1。
const (a = iotab = iotac = iota
)
第一个 iota 为 0,当 iota 在新的一行被使用时,它的值会自动加 1,所以可以简写:
const (a = iotabc
)
//demo2
package mainimport "fmt"func main() {const (a = iota //开始计数,从 0 开始b //1c //2d = "hello" //3,helloe //4,相当于 e = "hello"f //5,相当于 f = "hello"g = 1 //6,1h //7,相当于 h = 1i //8,相当于 i = 1j = iota // 恢复计数,9k //10l //11)fmt.Println(a, b, c, d, e, f, g, h, i, j, k, l)
}
输出结果是:
0 1 2 hello hello hello 1 1 1 9 10 11
那么 iota 在 const 关键字出现时将被重置为 0 怎么理解呢?先看这段代码:
//demo3
package mainfunc main() {const (a = iotabcdef)println(a, b, c, d, e, f)
}
输出结果是:
0 1 2 3 4 5
再看这段代码:
//demo4
package mainfunc main() {const (a = iotabc)println(a, b, c)const (d = iotaef)println(d, e, f)
}
输出结果是:
0 1 2
0 1 2
稍微琢磨一下上述两段代码,就会很容易理解 iota 在 const 关键字出现时将被重置为 0 的含义了。
思考题
//demo5
package mainimport "fmt"func main() {const (a = 1 << iota //第一行b = 3 << iota //第二行c //第三行d //第四行)fmt.Println(a, b, c, d)
}
这段代码的结果是多少?
首先 << 表示左移。
- 先来看第一行,iota 为 0,因为这个 iota 是在 const 关键字刚出现,那么第一行就可以表示成:
a = 1 << 0
左移 0 位,那就是没有变化。
- 再来看第二行,此时 iota 为 1,那么第二行就可以表示成:
b = 3 << 1
3 的二进制是 0000 0011(为了看着方便,我用八位二进制表示),左移 1 位就变成了 0000 0110,它的值是 2 ^ 2 + 2 ^ 1 = 6
- 再看第三行,有了前面的 iota 的知识,我们知道第三行本质上就是:
c = 3 << iota
此时 iota 已经变成 2 了。那么实际上第三行是:
c = 3 << 2
3 的二进制是 0000 0011,左移两位变成了 0000 1100,它的值是 2 ^ 3 + 2 ^ 2 = 12
- 再看第四行,和第三行的区别在于 iota 变成了 3,所以实际上第四行是:
d = 3 << 3
将 0000 0011 左移 3 位变成了 0001 1000,它的值是 2 ^ 4 + 2 ^ 3 = 24。
所以整段代码最终的输出结果是:
1 6 12 24
对于左移操作,有简便算法,左移一位表示乘以 2,左移 n 位表示该数乘以 2 ^ n(2的n次方),所以左移一位其实是乘以 2 的一次方,左移零位也是一样。可以用这种方法再算一遍,看和上述结果是否一致。而右移和左移的唯一区别就是左移是乘以,右移是除以。
相关文章:
【go入门】常量
目录 定义枚举iota思考题 定义 go语言常量的定义和其他语言类似,常量中的数据类型只能是布尔型,数字型(整型、浮点型、复数)和字符串型 常量的定义方式和变量一样,只不过变量定义使用 var 关键字,而常量定…...

2.1 HuggingFists系统架构(二)
部署架构 上图为HuggingFists的部署架构。从架构图可知,HuggingFists主要分为服务器(Server)、计算节点(Node)以及数据库(Storage)三部分。这三部分可以分别部署在不同的机器上,以满足系统的性能需求。为部署方便,HuggingFists社区版将这三部…...
工具类:JWT
工具类:JWT 依赖JwtUtil.java 依赖 <!-- 创建、解析 和 验证JSON Web Tokens (JWT)--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependenc…...

王道-计网
2 采用滑动窗口机制对两个相邻结点A(发送方)和B(接收方)的通信过程进行流量控制。假定帧的序号长度为3比特,发送窗口与接收窗口的大小均为7,当A发送了编号为0、1、2、3这4个帧后,而B接收了这4个帧,但仅应答了0、1两个帧,A继续发送4、5两个帧,且这两个帧已进入B的接收…...

【机器学习(十)】时间序列案例之月销量预测分析—Holt-Winters算法—Sentosa_DSML社区版
文章目录 一、Holt-Winters算法原理(一) 加法模型(二) 乘法模型(三) 阻尼趋势 二、Holt Winters算法优缺点优点缺点 三、Python代码和Sentosa_DSML社区版算法实现对比(一) 数据读入和统计分析(二) 数据预处理(三) 模型训练和模型评估(四) 模型可视化 四、总结 一、Holt-Winters…...
Webpack优化问题
目录 打包流程swcthread-loaderhash升级插件 打包流程 webpack 的打包流程大致可以分为以下几个步骤: 初始化:webpack 通过配置文件和 Shell 参数,初始化参数,确定入口文件、输出路径、加 载器、插件等信息。接下来读取配置文件…...
yjs10——pandas的基础操作
1.pandas读入文件——pd.read_cvs() data pd.read_csv("E:/机器学习/data/salary.csv") 注意:1.是pd.read_cvs,不要顺手写成np.read_cvs 2.路径的斜杠方向是/,不是\,如果直接从电脑粘贴路径,路径写法是\&am…...

Squaretest单元测试辅助工具使用
1、idea安装插件 Squaretest 然后关掉idea 2、安装字节码软件(jclasslib) 3、找到idea里面的Squaretest安装目录 找到包含TestStarter的jar包 4、打开 com.squaretest.c.f 打开后选择常量池 5、找到第16个修改 Long value值,修改的数字即为使…...

MFU简介
1、缩写 MFU - Mask Field Utilization(光刻掩膜版有效利用比例) GDPW - Gross Die Per Wafer,每张wafer上die的数量 2、什么是MASK 在光刻机中,光源(紫外光、极紫外光)透过mask曝光在晶圆上形成图…...

十分钟实现内网连接,配置frp
十分钟实现内网连接,配置frp 一.frp是什么?其实是一款实现外网连接内网的一个工具,个人理解,说白了就像是teamviwer一样,外网能访问内网。 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服…...

解决MySQL命令行中出现乱码问题
在MySQL命令行中遇到乱码问题通常是由于字符编码设置不正确导致的。以下是一些解决步骤: 1. **检查和设置字符集**: 首先,您需要确保MySQL服务器、客户端和数据库使用的是正确的字符集。您可以通过执行以下命令来查看当前的字符集设置&…...

TS系列(7):知识点汇总
你好,我是沐爸,欢迎点赞、收藏、评论和关注。 一、TS是什么? TypeScript 由微软开发,是基于 JavaScript 的一个扩展语言。TypeScript 包含 JavaScript 的所有内容,是 JavaScript 的超集。TypeScript 增加了静态类型检…...

Unity 查看Inspectors组件时严重掉帧
遇到一个问题,就是运行一个脚本的时候,只要我查看它的Inspectors,就会严重掉帧。 原本是30fps,只要查看这个组件,就掉到5fps。 这还真有点像波粒二象性,一观察就会掉帧,不观察就正常。 using…...
golang学习笔记23-面向对象(五):多态与断言【重要】
本节也是GO核心部分,很重要。 注:由于导包语句已经在19讲(笔记19:面向对象的引入)展示过了,所以这里就不展示了。 一、多态(Polymorphism) 变量(实例)具有多…...

RabbitMQ基础知识
1.1 什么是MQ? 消息队列(Message Queue),是基础数据结构中 “先进先出” 的一种数据结构。 一般用来解决应用解耦、异步消息、流量削峰等问题,实现高性能、高可用、可伸缩和最终一致性架构。 RabbitMQ可以理解为一个邮箱&#x…...

基于Python大数据的音乐推荐及数据分析可视化系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…...

安达发|太阳能设备行业APS计划排程软件能解决哪些问题
在当今快速发展的太阳能设备行业中,高级计划与排程(APS)软件成为了企业优化生产流程、提高生产效率和满足市场需求的关键工具。APS软件通过集成先进的算法和数据分析技术,为企业提供了一个全面的生产计划和排程解决方案。本文将探…...

CaChe的基本原理
目录 一、Cache的定义与结构 二、Cache的工作原理 三、Cache的映射与替换策略 四、Cache的写操作处理 Cache,即高速缓冲存储器,是计算机系统中位于CPU与主存之间的一种高速存储设备。它的主要作用是提高CPU对存储器的访问速度,从而优化系…...

数据结构-栈(理解版)
一、栈的定义 相信大家对于栈或多或少有一些了解,可能大多数人会告诉你栈是一种先进后出的数据结构。这其实说了跟没说一样(❁◡❁)!当然(last in,first out)是栈最有特色的性质。 这里可以给大家一些比较好理解的例…...
NAND Flash虚拟层初始化
在整个NAND Flash初始化过程中,其主要过程由NAND_Init()函数来完成的,因此以下以NAND_Init()函数作为入口,对NAND Flash虚拟层初始化进行全面分析: NAND_Init()NAND_PhyInit()FMT_Init()FMT_FormatNand()LML_Init() NAND_Init()函数首先调用NAND_PhyInit()函数…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...