Go语言里面的各种疑难杂症

  • 什么是闭包?闭包有什么缺陷?
func AddUpper() func(int)int{var n int =10return func (x int) int{n = n+xreturn n}
}func main(){f := AddUpper()fmt.Println(f(1))//11fmt.Println(f(2))//13fmt.Println(f(3))//16
}

(1) AddUpper是一个函数,返回的数据类型是func (int) int
(2)闭包可以这么理解:返回一个匿名函数,但是这个匿名函数引用到了函数外的n,因此这个匿名函数就和n形成一个整体,构成闭包。
(3)也可以理解为:闭包是类,函数是操作,n是字段。函数和它使用到的n构成闭包。
(4)当我们反复调用f函数时,因为n是初始化一次,因此每调用一次就进行一次累计。
(5)搞清楚闭包的关键,就是分析出返回的函数它使用到哪些变量。
缺陷:闭包的缺陷大家可以搜索下,有一堆的缺陷,什么可读性差、性能问题等等。但是,我个人认为最为重要的一点是匿名函数和函数外的变量生命周期不一致这点导致的问题。如果匿名函数的生命周期比外部变量长,那么外部变量便无法被及时回收,导致内存泄漏;反之,如果匿名函数的生命周期比外部变量短,则会出现一个有意思的现象,匿名函数所引用到的外部变量值不一致。

  • 什么情况下会出现栈溢出?
    (1)递归调用层数过深
    (2)无限循环
    (3)大量的函数调用嵌套:在某些情况下,如果函数调用层次过深,每次函数调用都会在栈上分配一些临时变量,当调用层次太多,栈可能会耗尽。
    (4)大规模的局部变量分配:如果一个函数内部有大量的局部变量需要分配,且这些变量占用控件比较大,也有可能导致栈溢出。

  • 什么是不定参数?调用方法时,不定参数可以传入0个值吗?方法内部怎么使用不定参数?
    不定参数是指函数或方法的参数数量是不确定的,并且可以接受任意数量的参数。在Go语言中,可以使用"…“语法来表示不定参数。
    在函数或方法的参数列表中,使用”…"来指定不定参数的类型。例如,func sum(numbers ...int)表示sum函数接受任意数量的int类型参数。
    在调用方法时,不定参数可以传入0个值。如果不定参数传入了0个值,那么在方法内部,不定参数的长度为0,即切片的长度为0。
    对于不定参数,在方法内部可以像操作普通切片一样使用。可以对不定参数进行迭代、切片操作,也可以将其传递给需要切片参数的函数或方法。
    以下是一个示例:

func sum(numbers ...int) int {total := 0for _, num := range numbers  total += numreturn total
}  
func main(){fmt.Println(sum(1, 2, 3))        // 输出:6fmt.Println(sum(4, 5, 6, 7, 8))  // 输出:30fmt.Println(sum())               // 输出:0,传入0个值
}   

在sum函数内部,不定参数numbers会作为一个int类型的切片。使用range关键字迭代不定参数,对每个元素进行累加操作。当传入0个值时,不定参数切片的长度为0,返回0。

  • 什么是defer?解释下defer的运作机制?
    在Go语言中,defer用于注册延迟执行的函数(或方法)调用,即在函数结束之前执行某个操作。defer语句会将要执行的函数压入一个栈中,当外围函数执行完毕时,栈中的函数按照先进后出的顺序执行。
    defer语句使用关键字"defer"加上要延迟执行的函数调用语句。可以在函数内部的任意位置使用defer语句,多个defer语句的执行顺序与声明顺序相反。
    以下是一个示例:
func main() {defer fmt.Println("1")defer fmt.Println("2")defer fmt.Println("3")fmt.Println("Hello")
}  

输出结果为:

Hello
3
2
1

在上面的示例中,"Hello"会先被打印出来,然后依次执行defer语句中的函数调用,按照逆序打印数字1、2、3。

defer通常用于释放资源、关闭打开的文件、解锁互斥锁等操作。当函数包含多个defer语句时,可以确保资源的释放和清理操作会在函数结束时执行,无论函数是正常返回还是发生异常。

需要注意的是,defer延迟执行的函数调用参数在defer语句出现时就会求值,而不是在函数返回时才求值。因此,在使用defer时要注意传递参数的值是否符合预期。
至于defer的实现机制:大家可以参考这篇博客:https://blog.csdn.net/weixin_41663412/article/details/104914850

  • 一个方法内部的defer能不能超过8个?
    可以,只不过超过8个,就不能使用开放编码机制。

  • defer内部能不能修改返回值?怎么改?
    在Go语言中,defer语句是在函数返回之前执行的。虽然可以在defer语句中修改函数内部局部变量的值,但是无法直接修改函数的返回值。
    但是,如果函数的返回值是通过命名返回值(named return values)方式定义的,那么可以在defer语句中修改返回值。命名返回值允许我们在函数体中为返回值赋值,并且可以在函数体中的任意位置随时修改返回值。
    下面是一个示例代码:

package mainimport "fmt"func example() (result int) {defer func() {result = 100 // 在defer语句中修改返回值}()result = 10 // 正常的返回值赋值return result // 返回值为修改后的值
}func main() {fmt.Println(example()) // 输出结果为100
}

在上述示例中,我们在defer语句中修改了返回值result的值,并且最终的返回结果被修改为了100。这是因为defer语句会在函数返回之前执行,所以最后的返回值会受到defer语句的影响。

  • 数组和切片有什么区别?
    数组和切片是Go语言中常用的数据结构,它们有以下几点区别:
  1. 长度固定 vs. 长度可变:数组的长度是固定的,定义时需要指定长度,并且无法修改。而切片的长度是可变的,可以根据需要进行动态扩容或裁剪。

  2. 数据存储方式:数组的元素在内存中是连续存储的,而切片则是一个对数组的引用,并包含了指向底层数组的指针、长度和容量等信息。

  3. 传递方式:通过值传递 vs. 通过引用传递:在函数间传递数组时,实际上是进行值传递,即将整个数组的副本传递给函数。而传递切片时,只是将切片的引用(指针)传递给函数,因此不会复制整个切片的内容,函数内部对切片进行的修改会反映到原始切片中。

  4. 使用方式:数组通常用于表示具有固定长度的集合,而切片则更适合处理动态变化的集合。切片提供了丰富的内置函数,如追加元素、裁剪切片、复制切片等,这些操作在数组上通常无法直接进行。

总的来说,数组适合用于长度固定,不需要频繁修改的情况;而切片则更具灵活性,适合处理长度变化、需要频繁操作的集合。
在这里插入图片描述

  • 切片怎么扩容?
    在这里插入图片描述
    扩容系数:当容量小于256(新版,旧版为1024)的时候,2倍扩容;否则按照1.25倍扩容。
    一开始是2倍扩容主要是为了提高内存的利用率和减少扩容的次数。当容器中的元素数量超过当前容量时,需要对容器进行扩容。通过将容量扩大到原来的2倍,可以在一定程度上减少扩容次数,因为每次扩容都需要重新分配更大的内存空间,并将原有数据复制到新的内存中,这个过程是比较耗时的。
    而后面改为1.25倍扩容是为了避免在容器元素数量较大时,扩容过程占用过多的内存空间。当容器的元素数量较大时,每次扩容后容量增加的幅度相对较小,这样可以更加灵活地利用内存,并且减少不必要的内存浪费。
    综上所述,一开始是2倍扩容可以提高内存利用率和减少扩容次数,后面改为1.25倍扩容可以减少内存占用和内存浪费。

切片的扩容与缩容:https://blog.csdn.net/qq_20867981/article/details/86467539

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

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

相关文章

PyTorch学习笔记(十六)——利用GPU训练

一、方式一 网络模型、损失函数、数据(包括输入、标注) 找到以上三种变量,调用它们的.cuda(),再返回即可 if torch.cuda.is_available():mynn mynn.cuda() if torch.cuda.is_available():loss_function loss_function.cuda(…

【操作系统】虚拟内存相关分段分页页面置换算法

虚拟内存是什么? 【进程地址空间虚拟地址空间C/C程序地址空间就是那个4G的空间】 虚拟内存是操作系统内核为了对进程地址空间进行管理,而设计的一个逻辑意义上的内存空间概念。在程序运行过程中,虚拟内存中需要被访问的部分会被映射到物理内…

安防视频监控平台EasyCVR视频集中存储平台接入RTSP设备出现离线情况的问题解决方案

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

用户新增预测——baseline学习笔记

一、赛题理解 1. 赛题名称 用户新增预测挑战赛 2. 赛题数据集 赛题数据由约62万条训练集、20万条测试集数据组成,共包含13个字段。其中uuid为样本唯一标识,eid为访问行为ID,udmap为行为属性,其中的key1到key9表示不同的行为属性…

什么是RNN(循环神经网络)

什么是RNN(循环神经网络) 循环神经网络(Recurrent Neural Network),在识别图像时,输入的每张图片都是孤立的,认出这张图片是苹果,并不会对认出下一张图片是梨造成影响。 但对语言来说,顺序是十分重要的,“…

07 mysql5.6.x docker 启动, 无 config 目录导致客户端连接认证需要 10s

前言 呵呵 最近再一次 环境部署的过程中碰到了这样的一个问题 我基于 docker 启动了一个 mysql 服务, 然后 挂载出了 数据目录 和 配置目录, 没有手动复制配置目录出来, 所以配置目录是空的 然后 我基于 docker 启动了一个 nacos, 配置数据库设置为上面的这个 mysql 然后 启…

ARM汇编【1】:数据类型

与高级语言类似,ARM支持对不同数据类型的操作。我们可以加载或存储的数据类型可以是有符号和无符号字、半字或字节。这些数据类型的扩展名是:-h或-sh表示半字,-b或-sb表示字节,不表示字的扩展名。有符号数据类型或无符号数据类型之…

Consistency Models终结扩散模型

最近看到一篇论文,觉得特别有意思,并且在学术界引起了不小的动静,他就是一致性模型,据说图像生成效果快、质量高,并且还可以实现零样本图像编辑,即不进行一些视觉任务训练,可以实现图像超分、修…

基于springboot+vue的论坛系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

改进YOLO系列:3.添加SOCA注意力机制

添加SOCA注意力机制 1. SOCA注意力机制论文2. SOCA注意力机制原理3. SOCA注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. SOCA注意力机制论文 暂未找到 2. SOCA注意力机制原理 3. SOCA注意力机制的配置 3.1common.py配置 ./models/common.p…

Docker+Jmeter+InfluxDB+Grafana 搭建性能监控平台

当今互联网发展迅速,应用程序的性能监控显得越来越重要。 DockerJmeterInfluxDBGrafana 是一种常用的性能监控平台,可以帮助开发者快速搭建一套可靠的监控体系。在本文中,我们将介绍如何使用这些工具搭建性能监控平台,以便开发人…

实现chatGPT 聊天样式

效果图 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Chat Example</title&g…

第9步---MySQL的索引和存储引擎

第9步---MySQL的索引和存储引擎 1.索引 1.1分类 索引可以快速的找出具有特定值的行。不用从头开始进行寻找了。 类别 hash和btree hash 根据字段值生生成一个hash的值 快速的进行定位到对应的行的值 可能会出现相同的值&#xff0c;找到对应的空间会出现对应的值 btree树…

CMA和CNAS是什么?两者有什么用途和区别?

CMA和CNAS是两个不同的概念&#xff0c;它们分别有着自己的用途和区别。 CMA是中国计量认证&#xff08;China Metrology Accreditation&#xff09;的缩写&#xff0c;是根据《中华人民共和国计量法》及其配套法规的规定&#xff0c;由国家质量监督检验检疫总局授权的计量认证…

HTML a标签

<a>标签定义一个超链接。它有如下主要属性&#xff1a; href&#xff1a;指定链接的地址&#xff0c;可以是一个URL、文件路径或锚点。target&#xff1a;指定链接在何处打开。其值包括&#xff1a; _blank&#xff1a;在新窗口或新标签页打开链接。_self&#xff1a;在…

Go语言基础之切片

切片 切片&#xff08;Slice&#xff09;是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活&#xff0c;支持自动扩容。 切片是一个引用类型&#xff0c;它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合 切片的定义…

事物有哪些特性 ?MySQL 如何保证事物的四大特性 ?

目录 1.事物有哪些特性 2. MySQL 如何保证事物的四大特性 3. 事物的隔离级别 1.事物有哪些特性 1.1 何为事物 &#xff1f; 事物就是把一件事情的多个步骤&#xff0c;多个操作&#xff0c;打包成一个步骤&#xff0c;一个操作。其中任意一个步骤执行失败&#xff0c;都会进…

模拟Stevens Lewis描述的小型飞机纵向动力学的非线性动态反演控制器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

毫米波雷达成像论文阅读笔记: IEEE TPAMI 2023 | CoIR: Compressive Implicit Radar

原始笔记链接&#xff1a;https://mp.weixin.qq.com/s?__bizMzg4MjgxMjgyMg&mid2247486680&idx1&snedf41d4f95395d7294bc958ea68d3a68&chksmcf51be21f826373790bc6d79bcea6eb2cb3d09bb1860bba0af0fd5e60c448ca006976503e460#rd ↑ \uparrow ↑点击上述链接即…

NER(命名实体识别)的介绍与使用--附源码

概述 本文将向您简要介绍命名实体识别,这是一种用于识别文本文档中存在的实体的流行方法。本文针对 NLP 领域的初学者。在本文末尾,已经实现了预训练的 NER 模型来展示实际用例。 为什么是NER? 图1 通过观察上