【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()函数…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...