Go语言关于const和iota进阶实战

简介: 你能做对这几道面试题吗?Go语言关于const和iota进阶实战

const 用于定义常量,定义之后不能修改,不能再次赋值,在程序运行期间不会改变。


定义一个常量


const pi = 3.1415926


批量声明常量


const (
   statusOk = 200
   notFound = 404
   serverError = 500
)


批量声明常量时,如果某一行没有写=,那么就和上一行一致


const (
   n1 = 100
   n2
   n3
)


打印结果:n1 n2 n3 都是100


iota


  1. 在const关键字出现时将被重置为0;
  2. const中每增加一行常量声明,将使 iota 计数一次
  3. 我iota的理解就是类似枚举


const (
   a1 = iota //0
   a2
   a3
)


打印结果:a1:0 a2:1 a3:2


iota面试题1


const (
   b1 = iota //0
   b2        //1
   _         //2
   b3        //3
)


分析:_也占了一行,所以_的值相当于是2,打印b3的值为3


iota面试题2:插队情况(1)


const (
   c1 = iota //0
   c2 = 100  //100
   c3        //100
   c4        //100
)



分析:c1=iota,所以c1的值为0很好理解;因为c2=100,而c3、c4没有=,所以和c2的值保持一致都是100


iota面试题3:插队情况(2)


const (
   d1 = iota //0
   d2 = 100  //100
   d3 = iota //2
   d4        //3
)


分析:d3的值为2可能出乎有些同学的意料,有的同学可能觉得d3的值为0,其实不是的。这道题其实就是为了让d3继续使用iota的方式设置值。 或者这么讲:在面试题2中怎么设置让c3不为100,而是继续按照iota赋值,让c3=2呢?面试题3就给出了答案。


多个常量声明在一行


const (
   d1, d2 = iota + 1, iota + 2 //1 2
   d3, d4 = iota + 1, iota + 2 //2 3
)


分析:其实很好理解,第一行的iota值为0,第二行的iota值为1,再执行加法运算就是注释中标注的结果了


iota应用实例


定义数量级


const (
   _  = iota
   KB = 1 << (10 * iota)
   MB = 1 << (10 * iota)
   GB = 1 << (10 * iota)
   TB = 1 << (10 * iota)
   PB = 1 << (10 * iota)
)


输出结果


KB: 1024
MB: 1048576
GB: 1073741824
TB: 1099511627776
PB: 1125899906842624


更进一步


猜一下下面代码段的输出结果是什么?


const (
   _  = iota
   KB = 1 << (10 * iota)
   MB
   GB
   TB
   PB
)


打印结果和上面是一样的:


微信图片_20221112124954.jpg


总结


定义常量使用const关键字,定义之后不能修改,不能再次赋值,在程序运行期间不会改变。

iota是go语言中很特殊的设定,我在PHP中还没用过类似的定义方式,关于iota还有哪些应用场景欢迎大家在评论区里指教


公众号:程序员升级打怪之旅

微信号:wangzhongyang1993

相关文章
|
1月前
|
人工智能 安全 算法
Go入门实战:并发模式的使用
本文详细探讨了Go语言的并发模式,包括Goroutine、Channel、Mutex和WaitGroup等核心概念。通过具体代码实例与详细解释,介绍了这些模式的原理及应用。同时分析了未来发展趋势与挑战,如更高效的并发控制、更好的并发安全及性能优化。Go语言凭借其优秀的并发性能,在现代编程中备受青睐。
100 33
|
4月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
4月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
19天前
|
分布式计算 Go C++
初探Go语言RPC编程手法
总的来说,Go语言的RPC编程是一种强大的工具,让分布式计算变得简单如同本地计算。如果你还没有试过,不妨挑战一下这个新的编程领域,你可能会发现新的世界。
41 10
|
12天前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
30 1
|
12天前
|
分布式计算 算法 Go
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
本文讲解了两道经典的图论问题:**岛屿数量(LeetCode 200)** 和 **腐烂的橘子(LeetCode 994)**,分别通过 DFS/BFS 实现。在“岛屿数量”中,利用深度或广度优先搜索遍历二维网格,标记连通陆地并计数;“腐烂的橘子”则采用多源 BFS,模拟腐烂传播过程,计算最短时间。两者均需掌握访问标记技巧,是学习网格搜索算法的绝佳实践。
39 1
|
12天前
|
Go
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
本篇博客详细解析了三道经典的动态规划问题:198. 打家劫舍(线性状态转移)、279. 完全平方数与322. 零钱兑换(完全背包问题)。通过 Go 语言实现,帮助读者掌握动态规划的核心思想及其实战技巧。从状态定义到转移方程,逐步剖析每道题的解法,并总结其异同点,助力解决更复杂的 DP 问题。适合初学者深入理解动态规划的应用场景和优化方法。
29 0
|
2月前
|
Go API 定位技术
MCP 实战:用 Go 语言开发一个查询 IP 信息的 MCP 服务器
随着 MCP 的快速普及和广泛应用,MCP 服务器也层出不穷。大多数开发者使用的 MCP 服务器开发库是官方提供的 typescript-sdk,而作为 Go 开发者,我们也可以借助优秀的第三方库去开发 MCP 服务器,例如 ThinkInAIXYZ/go-mcp。 本文将详细介绍如何在 Go 语言中使用 go-mcp 库来开发一个查询 IP 信息的 MCP 服务器。
120 0
|
4月前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
存储 JSON API
Go语言:RESTful API 服务,急速入门!
REST即表述性状态传递(英文:Representational State Transfer,简称REST),它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性
554 0
Go语言:RESTful API 服务,急速入门!