Go语言查缺补漏ing Day1
Go语言查缺补漏ing Day1
一、多个defer的执行顺序
package mainimport "fmt"func main() {defer fmt.Println("天才第一步")defer fmt.Println("雀氏纸尿裤")defer fmt.Println("战神第一步")defer fmt.Println("盖亚纸尿裤")}
我们在实际项目开发中,经常会遇到使用多个defer来进行延时处理的情况,这时候,了解多个defer同时存在的情况下,它们的执行顺序就是十分重要的了。
这段代码的运行结果是:
盖亚纸尿裤
战神第一步
雀氏纸尿裤
天才第一步
也就是说,当多个defer语句并称时,它们遵循后进先出的顺序。
二、defer与return的先后执行顺序
package mainimport "fmt"func main() {fmt.Println("主函数:", d())
}
func d() int {i:=0defer func() {i+=10fmt.Println("先来的defer语句:", i)}()defer func() {i++fmt.Println("后到的defer语句:", i)}()return i
}
先看一看执行结果:
后到的defer语句: 1
先来的defer语句: 11
主函数: 0
明白执行顺序了吗?
明白的同学这里可以跳过了,我来讲解一下,前面讲了defer语句的执行顺序是后到先出。所以两个defer中先输出后到defer语句,再输出先来的defer语句。但是主函数输出0,这就说明返回值是0,这就说明是先return再执行defer语句。并且注意函数结束是defer完成之后再结束。
三、for…range…创建的是每个元素的副本
package mainimport "fmt"func main() {slice := []int{0, 1, 2, 3, 4, 5}m := make(map[int]*int)for key, value := range slice {m[key] = &value}for k, v := range m {fmt.Println("key=",k,"value=",*v)}
}
先来看一看运行结果,再来具体讲述:
key= 0 value= 5
key= 1 value= 5
key= 2 value= 5
key= 3 value= 5
key= 4 value= 5
key= 5 value= 5
我们会发现key没问题,但是value都是一样的,是不是明白了什么?m[key] = &value
是不是取得是value的地址,这就说明for…range…生成的是每个元素的副本,而不是每个元素的引用。至于为什么都是5,而不是其它,是因为value最后被赋值5.而所有value都指向这个地址,所以输出的所有value都相同。
我们可以加一行代码,就能达到我们本来想达到的目的了。
package mainimport "fmt"func main() {slice := []int{0, 1, 2, 3, 4, 5}m := make(map[int]*int)for key, value := range slice {v := valuem[key] = &v}for k, v := range m {fmt.Println("key=",k,"value=",*v)}
}
修改后的程序运行结果是:
key= 3 value= 3
key= 4 value= 4
key= 5 value= 5
key= 0 value= 0
key= 1 value= 1
key= 2 value= 2
四、用make创建slice需要注意的一处小地方
package mainimport "fmt"func main() {s1 := make([]int,3)s2 := make([]int,0)s1 = append(s1, 8, 8, 8)s2 = append(s2, 8, 8, 8)fmt.Println("s1=>",s1)fmt.Println("s2=>",s2)
}
运行结果是:
s1=> [0 0 0 8 8 8]
s2=> [8 8 8]
我们可以看到,append了三个8之后,s1前面有3个0,而s2前面却没有0。这就说明使用make创建slice,会自动填充n个零。
Go语言查缺补漏ing Day1相关推荐
- 查缺补漏:集和与非平凡属性
查缺补漏:集和与非平凡属性 前面的习题和知识点补充 Conjunctive normal form(CNF)是布尔逻辑的一种方法,它将公式表示为带有AND或or的子句的连词.由连词or AND连接的每 ...
- 赫斌老师数据结构视频查缺补漏笔记
赫斌老师数据结构视频查缺补漏笔记 观看学习赫斌老师数据结构的视频,记录下自己之前学习这块内容时似懂非懂的知识,仅针对自己查缺补漏使用 视频链接:<郝斌老师数据结构自学视频> 1.指针的大小 ...
- MySQL查缺补漏 从无到有
MySQL查缺补漏 从无到有 有这一篇就够了 数据库概述 SQL概述 什么是数据库 MySQL概述 SQL的分类 DOS命令窗口使用MySQL的基本命令 查看MySQL的版本 进入MySQL 导入数据 ...
- JAVA核心,200例,查缺补漏
适用于想要查缺补漏的人:本已经掌握的技术,但是不知道如何表达的人:不断完善技自己,顺带梳理下答案. 主要包括以下模块:Java基础.容器.多线程.反射.对象拷贝.Java Web模块,异常.网络.设计 ...
- java基础的查缺补漏
打好基础,加油加油加油! 文章目录 前言 day1(6.16test,7.2) day2(7.3) java运行机制 java关键字 变量定义 常量定义 7.4 7.6 总结 前言 为了方便自己回顾知 ...
- Python高效技巧(三)---查缺补漏(时间处理、shutill模块、高阶函数、装饰器)
Python高效技巧 前言: 函数 1.可接受任意数量参数的函数和关键词参数 2.匿名函数 lambda 二.其他 1.关于序列的各种方法 2.产生器表达式 三. 查缺补漏 1.时间处理 1. cal ...
- Java 基础开发技术查缺补漏笔记
暑假期间,个人对一些未来研究生阶段可能会常用的编程技术进行重新一轮的系统复习和学习,及希望能够查缺补漏,有所提升.本文也是作为复习和学习过程中的笔记,用于长久的记录.不排除其中可能含有部分疏漏和错误, ...
- EFCore查缺补漏(二):查询
相关文章: EFCore查缺补漏 第 20 轮 TechEmpower 评测结果出炉了,ASP.NET Core 的 Plaintext 成绩名列前茅,带着 EFCore 的测试却在 Single q ...
- I2C总线学习—查缺补漏—S3C2440的I2C控制器
I2C总线学习-查缺补漏-S3C2440的I2C控制器 学习了IIC总线协议的理论部分,觉得应该学习具体操作2440的IIC控制器,毕竟最终都是为了学习S3C2440 ...
- I2C总线学习—查缺补漏—应答信号ACK
I2C总线学习-查缺补漏-应答信号ACK IIC协议规定,当主机作为接收设备时,主机对最后一个字节不应答,以向发送设备(从设备)标识数据传送结束.这是因为每次传输都应得到应答信号后 ...
最新文章
- 解决win7 64位操作系统下安装PL/SQL后连接报错问题: make sure you have the 32 bits oracle client installed
- 可能会用到的弹出框用法
- a,b互换,不使用中间变量
- SRM144 DIV2 1100
- 6年Microsoft MVP,是否还能坚持4年?
- linux fedora35安装kvm虚拟机命令整理
- XCTF(攻防世界)—进阶web题Write Up(二)
- .net core 中使用httpclient,HttpClientFactory的问题
- opcua客户端实现断线重连_PLCopen amp; OPC UA信息模型
- 老李分享:基于图像识别的跨平台的手机自动化测试方案
- 完全弄懂C++中的构造与析构函数
- 中国开源视频编辑软件行业市场供需与战略研究报告
- Redis与Mysql双写一致性方案解析
- Oracle快速入门(1)——ORACLE数据库简介
- c语言pow函数原型_c语言中的pow()函数怎么用
- Android 9 系统修改内设WLAN热点名称
- 2022-2028全球工业用视频内窥镜行业调研及趋势分析报告
- Java学习笔记之 Lambda表达式
- 免费域名证书最新申请方式大全
- symantec忘记了密码时如何卸载?
热门文章
- 外星人笔记本计算机在哪里,笔记本电脑没声音,详细教您外星人笔记本没声音如何解决...
- 打外星生物的塔防java_《异形防御者》测评:外星人也玩塔防游戏
- 井字棋(棋子可消去(拿走))
- 【组合优化】旅行商问题Traveling Salesman Problem(TSP)-约束定义
- 高颜值游戏专属蓝牙耳机推荐,2020五款商城高人气蓝牙耳机
- C# winfrom 在button按钮上显示箭头
- ArcGis 10.2运行提示“未授权”的解决方法
- CANoe软件使用(一)——软件界面介绍
- 数字图像处理Python语言实现-图像增强-导向滤波(Guided Filter)
- 阿里云机器学习平台PAI之分类实践