go基础语法10问(2)

1.recover的执行时机

无,recover 必须在 defer 函数中运行。recover 捕获的是祖父级调用时的异常,直接调用时无效。

func main() {recover()panic(1)
}

直接 defer 调用也是无效。

func main() {defer recover()panic(1)
}

defer 调用时多层嵌套依然无效。

func main() {defer func() {func() { recover() }()}()panic(1)
}

必须在 defer 函数中直接调用才有效。

func main() {defer func() {recover()}()panic(1)
}

2.闭包错误引用同一个变量问题怎么处理

在每轮迭代中生成一个局在这里插入代码片部变量 i 。如果没有 i := i 这行,将会打印同一个变量。

func main() {for i := 0; i < 5; i++ {i := idefer func() {println(i)}()}
}

或者是通过函数参数传入 i 。

func main() {for i := 0; i < 5; i++ {defer func(i int) {println(i)}(i)}
}

3.在循环内部执行defer语句会发生啥

defer 在函数退出时才能执行,在 for 执行 defer 会导致资源延迟释放。

func main() {for i := 0; i < 5; i++ {func() {f, err := os.Open("/path/to/file")if err != nil {log.Fatal(err)}defer f.Close()}()}
}

unc 是一个局部函数,在局部函数里面执行 defer 将不会有问题。

4.说出一个避免Goroutine泄露的措施

可以通过 context 包来避免内存泄漏。

func main() {ctx, cancel := context.WithCancel(context.Background())ch := func(ctx context.Context) <-chan int {ch := make(chan int)go func() {for i := 0; ; i++ {select {case <- ctx.Done():returncase ch <- i:}}} ()return ch}(ctx)for v := range ch {fmt.Println(v)if v == 5 {cancel()break}}
}

下面的 for 循环停止取数据时,就用 cancel 函数,让另一个协程停止写数据。如果下面 for 已停止读取数据,上面 for 循环还在写入,就会造成内存泄漏。

5.如何跳出for select 循环

通常在for循环中,使用break可以跳出循环,但是注意在go语言中,for select配合时,break 并不能跳出循环。

func testSelectFor2(chExit chan bool){EXIT:for  {select {case v, ok := <-chExit:if !ok {fmt.Println("close channel 2", v)break EXIT//goto EXIT2}fmt.Println("ch2 val =", v)}}//EXIT2:fmt.Println("exit testSelectFor2")
}

6.如何在切片中查找

go中使用 sort.searchXXX 方法,在排序好的切片中查找指定的方法,但是其返回是对应的查找元素不存在时,待插入的位置下标(元素插入在返回下标前)。

可以通过封装如下函数,达到目的。

func IsExist(s []string, t string) (int, bool) {iIndex := sort.SearchStrings(s, t)bExist := iIndex!=len(s) && s[iIndex]==treturn iIndex, bExist
}

7.如何初始化带嵌套结构的结构体

go 的哲学是组合优于继承,使用 struct 嵌套即可完成组合,内嵌的结构体属性就像外层结构的属性即可,可以直接调用。
注意初始化外层结构体时,必须指定内嵌结构体名称的结构体初始化,如下看到 s1方式报错,s2 方式正确。

type stPeople struct {Gender boolName string
}type stStudent struct {stPeopleClass int
}//尝试4 嵌套结构的初始化表达式
//var s1 = stStudent{false, "JimWen", 3}
var s2 = stStudent{stPeople{false, "JimWen"}, 3}
fmt.Println(s2.Gender, s2.Name, s2.Class)

8.切片和数组的区别

数组是具有固定长度,且拥有零个或者多个,相同数据类型元素的序列。数组的长度是数组类型的一部分,所以[3]int 和 [4]int 是两种不同的数组类型。数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变;数组是值传递。数组是内置类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。在初始化后长度是固定的,无法修改其长度。
当作为方法的参数传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。数组定义:

var array [10]intvar array =[5]int{1,2,3,4,5}

9.new和make的区别

new 的作用是初始化一个指向类型的指针 (*T) 。new 函数是内建函数,函数定义:func new(Type) Type。使用 new 函数来分配空间。传递给 new 函数的是一个类型,不是一个值。返回值是指向这个新分配的零值的指针。
make 的作用是为 slice,map 或 chan 初始化并返回引用 (T)。make 函数是内建函数,函数定义:func make(Type, size IntegerType) Type;第一个参数是一个类型,第二个参数是长度;返回值是一个类型。
make(T, args) 函数的目的与 new(T) 不同。它仅仅用于创建 Slice, Map 和 Channel,并且返回类型是 T(不是T)的一个初始化的(不是零值)的实例。

10.Printf()、Sprintf()、Fprintf()函数的区别用法是什么

都是把格式好的字符串输出,只是输出的目标不一样。
Printf(),是把格式字符串输出到标准输出(一般是屏幕,可以重定向)。Printf() 是和标准输出文件 (stdout) 关联的,Fprintf 则没有这个限制。
Sprintf(),是把格式字符串输出到指定字符串中,所以参数比printf多一个char*。那就是目标字符串地址。
Fprintf(),是把格式字符串输出到指定文件设备中,所以参数比 printf 多一个文件指针 FILE*。主要用于文件操作。Fprintf() 是格式化输出到一个stream,通常是到文件。

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

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

相关文章

Ubuntu18安装(重启黑屏问题)

1. F10 进入bios&#xff0c;选择u盘里的ubuntu镜像 2.进入使用ubuntu&#xff0c;下载 3.重启&#xff0c;esc 4.ubuntu 安e进入 5. nomodeset&#xff08;&#xff09; F10 保存启动 6. 7.没有网 手机usb提供网络 下载有限网卡驱动

【头歌实训】分布式文件系统 HDFS

文章目录 第1关&#xff1a;HDFS的基本操作任务描述相关知识HDFS的设计分布式文件系统NameNode与DataNode HDFS的常用命令 编程要求测试说明答案代码 第2关&#xff1a;HDFS-JAVA接口之读取文件任务描述相关知识FileSystem对象FSDataInputStream对象 编程要求测试说明答案代码 …

2023.12.3 hive-sql日期函数小练习

目录 时间函数练习 时间戳 周,季度等计算 获取日期相关 获取当前时间 时间函数练习 --日期函数练习 ,sub是英文subtraction减法的简写, add是英文addition加法的简写 --获取今天是本周的第几天 select dayofweek(2023-12-3); --周日为一周的第一天 select current_timest…

代码随想录算法训练营 ---第五十七天

今天是两道动态规划的经典题目。 第一题&#xff1a; 简介&#xff1a; 做了今天的题目我有了新的理解&#xff0c;我觉得过去我过于注重对于二维数组的理解&#xff0c;忽略了对dp数组i 和 j 的含义的理解。 动态规划五部曲&#xff1a; 1.确定dp数组的含义 本题我们将i …

git: 修改commit的comment

1. 修改最后一次commit的comment git commit --amend输入i进入编辑模式&#xff0c;修改后&#xff0c;Esc退出编辑模式&#xff0c;输入:wq!保存并退出 2. 修改历史的某个commit的comment 在修改前&#xff0c;先保证没有未提交的更改&#xff0c;如果有&#xff0c;需要co…

什么是https加密协议?

什么是https加密协议 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种用于在计算机网络上安全传输数据的通信协议。它是HTTP的安全版本&#xff0c;通过使用加密和身份验证机制来保护数据传输的安全性和完整性。HTTPS使用SSL&#xff08;Secure Socke…

cuda驱动安装

cuda驱动安装失败 You do not appear to have libc header files installed on your system. Please install your distributions libc development package. ok,我来安装libc sudo apt-get install libc6-dev build-essential 失败 libc6-dev : 依赖: libc6 ( 2…

vue使用vue-router路由控件

vue-router是官方路由控件&#xff0c;但官网竟然没有该路由的使用方法啊&#xff0c;只有单页面的简单示例&#xff0c;引用的是网页js模式&#xff0c;不是vue的引用模式啊。 {"name": "vue01","private": true,"version": "0…

艾泊宇产品战略:低价的战争:阿里、京东、拼多多的终局推演

导读 这个双十一&#xff0c;是一场三大巨头的低价战争。 而如今双十二快到了&#xff0c;他们的低价战争还会继续吗&#xff1f; 阿里要做“全网最低价”&#xff0c;京东要做”真便宜 闭眼买“&#xff0c;拼多多则是“天天11.11&#xff0c;天天真低价” 阿里、京东作为…

面试操作系统八股文五问五答第一期

面试操作系统八股文五问五答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.死锁产生的条件 1.互斥条件&#xff0c;即当资源被一个线程使用&#xff08;…

流畅的python--小技巧总结

对于百万级以上数据的读写效率优化 在Python中&#xff0c;我们可以通过array模块来方便地创建和操作数组&#xff0c;array模块提供了性能优异的数组操作方法&#xff0c;可以使我们的代码更加高效。同时&#xff0c;Python也提供了读写二进制文件和普通文本文件的方法&#…

Rename--CAM在checkpoint恢复上的流程与优势

参考自&#xff1a;计算机体系结构-寄存器重命名 - 知乎 (zhihu.com) 这里的重点在红色部分描述上&#xff0c;也是容易想不通的地方&#xff1b; 在SRAM方法中要恢复映射表状态&#xff0c;需要事先把分支指令来临时刻的映射表全份拷贝下来&#xff0c;然后在恢复时把备份复制…

Linux 环境下,jdbc连接mysql问题

1. 下载MySQL的JDBC驱动&#xff1a; 从MySQL官网下载最新的MySQL Connector/J&#xff0c;并将其解压到某个目录&#xff0c;比如/usr/local/mysql/。 2. 将JDBC驱动添加到类路径&#xff1a; 将JDBC驱动添加到类路径&#xff0c;可以使用以下命令&#xff1a; export CLA…

AMEYA360分析兆易创新GD32A490系列车规级MCU

兆易创新GigaDevice今日宣布&#xff0c;正式推出全新GD32A490系列高性能车规级MCU&#xff0c;以高主频、大容量、高集成和高可靠等优势特性紧贴汽车电子开发需求&#xff0c;适用于车窗、雨刷、智能车锁、电动座椅等BCM车身控制系统&#xff0c;以及仪表盘、娱乐影音、中控导…

每日OJ题_算法_双指针②_力扣1089. 复写零

目录 力扣1089. 复写零 解析代码 力扣1089. 复写零 1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 难度 简单 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在…

4.3 容器编排工具的比较与选择

容器编排工具的比较与选择 Kubernetes 介绍 Kubernetes&#xff0c;是目前最流行和功能强大的容器编排平台之一。强调 Kubernetes 的自动化、高可用、扩展性和灵活的特点。讨论 Kubernetes 的主要组件和架构&#xff0c;如 Master 节点、Node 节点、控制器和调度器等。分析 Ku…

智慧景区(园区)数字孪生可视化GIS解决方案

随着技术的日新月异&#xff0c;景区日常管理及运营中使用到的智慧化工具越来越丰富&#xff0c;智慧化硬件设备也越来越多&#xff0c;而其中各个管理系统往往又是相互独立&#xff0c;形成一个个数据孤岛。智慧景区管理平台就是将各个孤岛中的数据及功能汇集起来&#xff0c;…

政采云基于 Dubbo 的混合云数据跨网实践

作者&#xff1a;王晓彬&#xff0c;政采云资深开发工程师 项目背景 政采云的业务是为政府提供的购物网站&#xff0c;类似于淘宝。政府采购会在政采云上做企业采购、政府采购的业务。 云岛中的“云”是指我们的云平台&#xff0c;云平台是我们公司自己部署的一套购物网站&a…

【计算机网络漫谈】OSI七层模型与TCP/IP四层(参考)模型

一、七层&#xff1f;四层&#xff1f; 1.为什么需要协议&#xff1f;2.OSI七层模型是干什么的&#xff1f;3.TCP/IP四层&#xff08;参考&#xff09;模型4.TCP/IP&#xff08;参考&#xff09;模型与OSI七层模型有什么异同&#xff1f; 二、自底向上的网络分层 1. 物理层2…

阻止事件e.stopPropagation()和e.preventDefault的区别

e.stopPropagation() 和 e.preventDefault() 是两个在事件处理中常用的方法&#xff0c;它们有不同的作用&#xff1a; e.stopPropagation(): 作用&#xff1a;阻止事件在DOM中的进一步传播&#xff0c;即停止事件冒泡。使用场景&#xff1a;当你希望阻止一个事件从目标元素向上…