
《Go语言小技巧&易错点100例》
文章平均质量分 79
Go语言小技巧&易错点100例
闫同学鸭
让旷野天空放一片晴
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
《Go小技巧&易错点100例》第三十七篇
Go语言特性解析: 结构体字段序列化规则:只有大写字母开头的可导出字段才会被JSON处理,小写字段会被忽略,这是Go的刻意设计 字符串不可变性:字符串是只读的字节切片,修改需先转为[]byte,体现了Go对安全性的考量 代码块作用域:{}会创建新作用域,:=会声明新变量,而=会修改外层变量,需注意两者的区别 (98字)原创 2025-08-10 21:29:40 · 309 阅读 · 0 评论 -
《Go小技巧&易错点100例》第三十六篇
通过合理使用 gops,开发者可以在不修改代码的前提下,有效提升 Go 服务的可观测性和运维效率。[https://github.com/google/gops] 工具为开发者提供了一套轻量级的诊断解决方案,无需侵入代码即可快速获取运行时的关键指标。包(Go 1.16+)将二进制文件或资源直接嵌入到编译产物中,使这些文件成为可执行文件的一部分。在 Go 语言开发中,进程诊断和性能分析是保障服务稳定性的关键环节。在Go语言中,交换两个变量的值可以通过简洁的。在Go语言中,可以通过标准库的。原创 2025-06-22 12:08:22 · 995 阅读 · 0 评论 -
《Go小技巧&易错点100例》第三十五篇
在Go语言开发中,我们经常会遇到结构体之间需要相互引用的情况。Go语言中的循环依赖问题看似简单,但可能导致严重的运行时错误。独立的执行栈:每个goroutine都有自己的调用栈,panic和recover机制是基于当前goroutine的调用栈的。设计哲学:Go的设计是让每个goroutine自己处理自己的错误,而不是由父goroutine来管理。但是在Go语言中直接进行结构体的相互引用会默认不符合语法,因此我们就使用接口进行引用。:NewA调用NewB,NewB又调用NewA,从而形成无限循环调用链。原创 2025-06-08 20:57:13 · 490 阅读 · 0 评论 -
《Go小技巧&易错点100例》第三十四篇
存储在堆中,如果goroutine的执行在for循环结束,那么i的值就是5,此时输出则会是。:将当前循环变量i的值拷贝到新goroutine的栈帧。,当然如果goroutine执行快,那输出就可能是。:创建新的G结构体(包含栈指针、PC等):可能触发当前M让出P,执行其他G。:将G加入全局运行队列或本地队列。我们来分析下代码,每个。而这段代码的临时变量。原创 2025-05-28 12:31:05 · 263 阅读 · 0 评论 -
《Go小技巧&易错点100例》第三十三篇
本文介绍了Go语言中的几个关键编程技巧和注意事项。首先,通过validator库扩展自定义校验规则,示例展示了如何验证用户年龄是否成年。其次,使用sync.Pool优化对象复用,特别是在频繁创建和销毁对象的场景中,如JSON编码。接着,讨论了sync.WaitGroup的正确使用方法,强调了在goroutine外部调用Add()以避免竞态条件。最后,探讨了nil的语义陷阱,指出不同类型的nil在比较时的差异,并提供了安全实践建议,如使用类型断言和反射进行深度检查。这些技巧有助于提升代码的健壮性和性能。原创 2025-05-11 22:35:27 · 448 阅读 · 0 评论 -
《Go小技巧&易错点100例》第三十二篇
本期分享主要介绍了sync.Map的原理与使用方式,以及如何在Go语言中实现有序的Map。 1. sync.Map的原理与使用方式 sync.Map通过读写分离和无锁读设计实现高并发安全,适用于读多写少、动态键空间的场景。其底层采用双存储结构(read和dirty),读优先访问无锁的read,未命中时访问加锁的dirty,并通过动态升级和延迟删除机制优化性能。测试表明,sync.Map在读多写少场景下性能显著优于传统的map+sync.RWMutex。 2. 实现有序的Map 在Go语言中,标准库的map是原创 2025-05-11 22:34:54 · 708 阅读 · 0 评论 -
《Go小技巧&易错点100例》第三十一篇
本期分享主要探讨了Go语言中的两个内存优化技巧:struct内存对齐和使用空结构体节省内存。首先,内存对齐通过调整结构体字段的顺序,减少填充字节,提升内存访问效率。通过实例展示了未对齐与对齐后的结构体内存占用差异,并总结了内存对齐的规则。其次,空结构体struct{}作为零内存类型,在实现集合、通道信号传递、方法接收器、占位通道、接口实现标记和JSON空对象等场景中,能够有效节省内存。文章还指出空结构体作为字段时可能产生对齐填充,并解释了不同空结构体实例的地址相同现象。这些技巧有助于编写更高效的Go代码。原创 2025-05-11 22:33:59 · 564 阅读 · 0 评论 -
Go小技巧&易错点100例(三十)
获取Go语言的注释主要用于自动化生成文档(如通过godoc生成API文档)、存储代码元数据(如Swagger规范的路由信息)、指导代码生成工具(如go generate指令)、辅助静态分析(如lint规则例外标记)以及标识测试示例,从而提升代码可读性、维护性及开发效率,实现文档与代码的同步更新。切片共享底层数组的特性,修改一个切片的元素可能会影响其他切片或原数组,具体取决于修改的位置是否在共享范围内。上面我们说明了一个结论就是,Go语言中的切片是底层数组的视图,修改切片时,直接修改了底层数组,导致。原创 2025-05-05 11:54:42 · 597 阅读 · 0 评论 -
Go小技巧&易错点100例(二十九)
随着 Go 语言的不断迭代,新版本带来了许多实用的标准库函数,使得代码更加简洁、可读性更强。本篇文章主要介绍 Go 1.21+ 版本中的一些新特性,涵盖等常见场景,展示如何利用新特性优化代码。原创 2025-05-05 11:53:33 · 613 阅读 · 0 评论 -
Go小技巧&易错点100例(二十八)
for循环select{}原创 2025-05-03 16:35:36 · 887 阅读 · 0 评论 -
Go小技巧&易错点100例(二十七)
Scan。原创 2025-05-03 16:34:48 · 1141 阅读 · 0 评论 -
Go小技巧&易错点100例(二十六)
在Go中,将字符串转换为字节数组会触发内存拷贝,这会影响性能和内存使用。在大多数情况下,这种开销是可以接受的,但在性能敏感的应用中,需要仔细考虑这种转换的代价。原创 2025-04-12 20:06:35 · 680 阅读 · 0 评论 -
Go小技巧&易错点100例(二十五)
通过自定义中间件,可以实现日志记录、认证、限流等功能,提高代码的模块化和可维护性。空切片在追加元素时,如果容量足够,可以直接在现有底层数组上进行操作,否则会分配一个新的底层数组。切片和空切片是两个不同的概念,但它们有一些共同点和不同点。空切片有一个底层数组,但其长度和容量都为0,指针部分指向一个有效的零长度数组。:有底层数组(但长度为0),指针指向一个有效的零长度数组,长度和容量都为0。切片和空切片的长度都是0。切片没有底层数组,其指针部分(即数组的指针)为。:没有底层数组,指针为。,长度和容量都为0。原创 2025-04-12 20:05:50 · 615 阅读 · 1 评论 -
Go小技巧&易错点100例(二十四)
和类型断言/类型开关可以提供一定的灵活性,但也会牺牲一些类型安全性。因此,在可能的情况下,最好使用具体的类型来避免不必要的类型检查和转换。:频繁的类型断言和类型开关可能会对性能产生影响,特别是在大型代码库中。因此,在设计接口和类型时,应该考虑如何减少不必要的类型检查。类型的值时,通常需要进行类型断言(type assertion)或类型开关(type switch)来校验其实际类型。:如果以上步骤都不能解决问题,可能是模块本身的问题,可以联系模块的维护者。类型的值是否满足特定的类型,并获取该类型的值。原创 2025-03-06 22:49:12 · 779 阅读 · 0 评论 -
Go小技巧&易错点100例(二十三)
命令将依赖添加到我们的项目,这个依赖可能会有其他依赖,从go.mod文件中应该可以看出,大多数情况下使用一次。在 Web 浏览器中打开此文件以查看模块的依赖项关系图。不可读的乱码,并不是我们期望的"12345"。扩展:可以看下官方文档对go.mod的说明。什么是mod依赖关系,就比如我们使用。然后运行一下就输出了想要的字符串。这将在当前目录中生成一个名为。原创 2025-02-25 23:21:02 · 591 阅读 · 0 评论 -
Go小技巧&易错点100例(二十二)
对于包含不可比较字段的结构体,如果需要比较它们,你通常需要实现自定义的比较逻辑,比如通过遍历所有可比较的字段并逐一比较它们,或者使用反射(reflection)来动态比较结构体中的字段(但请注意,反射可能会影响性能,并且可能会使代码更难理解和维护)。Go语言中的结构体是否可比较取决于其字段的类型。如果结构体仅包含可比较的字段,则可以使用。原创 2025-02-25 23:20:09 · 1084 阅读 · 0 评论 -
Go小技巧&易错点100例(二十一)
errors.Is。原创 2025-01-05 22:01:19 · 879 阅读 · 0 评论 -
Go小技巧&易错点100例(二十)
如果当前容量大于等于1024,扩容后的容量会按照增长因子(默认为1.25)来计算,即新的容量为原容量的1.25倍。Go语言的slice扩容策略在不同的版本和slice容量大小下有所不同,但总体思路是相似的,即创建一个更大的底层数组,并将原始数据复制到新数组中。:用于向切片末尾追加一个或多个元素,并返回一个新的切片(可能是原切片的扩展,也可能是新分配的切片)。会分配一个更大的切片,并将原切片的内容复制到新切片中,然后追加新的元素。类型转换是昂贵的操作,应该避免在性能敏感的代码中进行不必要的类型转换。原创 2025-01-01 10:40:24 · 543 阅读 · 0 评论 -
Go小技巧&易错点100例(十九)
正文:在Go语言中,goto语句和标签(label)提供了一种跳转到程序中的另一个位置的方式。虽然这种特性在解决某些类型的复杂逻辑时可能很有用,但过度使用goto可能会导致代码难以理解和维护。因此,建议谨慎使用,并优先考虑使用循环、条件语句等更结构化的控制流机制。原创 2024-12-31 23:08:14 · 882 阅读 · 0 评论 -
Go小技巧&易错点100例(十八)
正文:有时候我们代码里会定义很长的数字,虽然计算机程序能支持很大的数据的计算,但是对我们来说,可读性是一个需要考虑的点,特别是1后面全是0的时候。但是这个问题在Go语言中是可以通过一个小技巧来解决的,如下代码:被赋值为10,000,000,而也使用了相同的值,但是使用了下划线作为千位分隔符。从Go 1.13开始,数字字面量中可以使用下划线******来增强可读性,但它不会改变数字的值。**所以,和是等价的。直接看代码:是一个占位符,它告诉函数在这个位置插入一个字符串类型的变量。方括号中的数字表示后面参数原创 2024-10-22 22:10:30 · 575 阅读 · 0 评论 -
Go小技巧&易错点100例(十七)
总的来说,Go语言中的定时任务具有广泛的应用场景和灵活的使用方法,可以帮助开发人员更好地管理和优化应用程序。在Go语言中,定时任务(也称为定时器或cron作业)具有多种作用,这些作用在应用程序的开发和运维中非常有用。,Go 程序可以调用 C 函数,使用 C 语言定义的数据类型,甚至可以使用 C 语言的头文件和源文件。这个类型的定时任务使用cron表达式进行任务的处理,比如下面代码的cron表达式。这个类型的定时任务是直接使用Go语言的内置类型进行计算,比较简单。(2)创建cron类型的定时任务。原创 2024-08-21 22:32:35 · 916 阅读 · 0 评论 -
Go小技巧&易错点100例(十六)
本期看点:正文开始:在Go语言中,切片(slice)是一个引用类型,它是对底层数组的抽象表示,提供了动态长度的、灵活的序列类型。切片包含三个重要的属性:指向底层数组的指针、切片的长度以及切片的容量。切片的长度和容量之间有一个重要的关系:切片的长度不会超过其容量。 这意味着,当你尝试向切片添加更多元素时,如果添加后的元素个数超过了切片的容量,Go语言会创建一个新的、更大的底层数组,并将原有元素和新元素复制到新数组中,然后让切片指向这个新的底层数组。这个过程称为切片的扩容。需要注意的是,切片的长度和容量是可以变原创 2024-08-21 22:31:50 · 1052 阅读 · 0 评论 -
预测一波,这份Go语言资料即将爆火
顾名思义,是一个旨在分享Go语言学习过程中的100个小技巧与易错点的仓库。这些技巧不仅覆盖了Go语言的基础语法、高级特性,还深入探讨了性能优化、并发编程等进阶话题。作者以文章的形式,将每一个问题、每一个技巧都阐述得清晰明了,既适合初学者巩固基础,也适合有一定经验的开发者查漏补缺、提升技能。原创 2024-07-12 22:19:13 · 508 阅读 · 0 评论 -
Go小技巧&易错点100例(十五)
本期看点:正文开始:在Go程序中我们经常会对接口执行的耗时做一个记录,特别是针对核心或复杂业务的时候,我们需要关注该业务的执行耗时,可以具体到某个方法,有一个简单有效的技巧,你可以使用关键字,只需一行代码即可使用。例如:Go链式编程链式编程(Chain Programming)也称为流式编程(Fluent Interface),是一种编程风格,其中方法的调用能够返回对象本身,从而允许调用者继续调用该对象的其他方法。这种风格的主要目的是通过减少代码的冗余和提高可读性来简化代码。链式编程通常具有以下特点:方原创 2024-04-20 09:39:20 · 513 阅读 · 0 评论 -
Go语言开发小技巧&易错点100例(十四)
init函数的执行机制【易】sync.Once同步【技】Go进行小数的运算【技】原创 2024-04-10 22:43:21 · 1305 阅读 · 0 评论 -
Go语言开发小技巧&易错点100例(十三)
函数则用于执行一个外部命令,尝试在Windows系统的命令提示符(cmd)中打开指定的URL。此外,还定义了一个名为。这段代码是一个简单的Go语言HTTP服务器,主要实现了文件上传和文件下载的功能。的函数,它用于执行任意命令,并读取命令的标准输出。函数,并传入了一个URL字符串作为参数。函数是程序的入口点,它调用了。原创 2024-02-25 11:32:01 · 727 阅读 · 1 评论 -
Go语言开发小技巧&易错点100例(十二)
反射是一种在运行时检查、修改和调用对象类型和值的能力。在Go语言中,原创 2024-02-14 21:18:57 · 1555 阅读 · 0 评论 -
Go语言开发小技巧&易错点100例(十一)
函数式编程是一种编程范式。为了解决这个问题,Go语言规定map的键必须是不可变(immutable)的类型,例如基本类型(如整数、字符串等),或者具有只读属性的复合类型(如数组、结构体等)。此外,在函数式编程中,函数是一等公民,这意味着它们可以绑定到名称(包括本地标识符),作为参数传递,并从其他函数返回,就像任何其他数据类型一样。总结起来,Go语言中指针类型不能作为map的键是因为指针的值是动态的,可能会发生变化,而map的键需要是不可变的类型。的map,该map的键是字符串类型,而值是空结构体类型(原创 2024-01-14 17:03:56 · 1009 阅读 · 0 评论 -
Go语言开发小技巧&易错点100例(十)
字符串的内容被存储在字符数组中,以字符的序列形式表示。该指针指向字符串的第一个字符,然后通过连续访问指针所指向的内存位置,可以遍历整个字符串。需要注意的是,切片截取操作返回的是一个新的切片,原始切片不会被修改。在高级编程语言中,string类型的底层定义都大致相同,通常情况下,string类型是由字符数组或字符指针来定义的。此外,需要注意的是,在进行切片截取操作时,要确保切片的索引在有效范围内,否则会导致运行时错误。,可以对字符串中的每个字符进行处理,而无需关心具体的字节表示。通过遍历字符串的每个。原创 2023-11-25 09:00:00 · 1320 阅读 · 1 评论 -
Go语言开发小技巧&易错点100例(九)
在Go语言中,检查nil是非常必要和重要的。这是因为Go语言中的指针和引用类型在默认情况下是nil,而在尝试访问nil指针或引用类型的成员时,会导致运行时错误。在Go语言中,参数传递是通过值传递实现的,无论是基本类型还是复合类型。然而,当涉及到指针和引用类型时,传递方式会有所不同。比如下面这段代码,猜猜输出的是什么?原创 2023-09-29 21:08:02 · 502 阅读 · 0 评论 -
Go语言开发小技巧&易错点100例(八)
因此我们得出结论,在直接序列化Message时最好使用Proto Marshal的方式进行序列化,防止特殊的属性不能够识别,而且该序列化的方式更加节省空间,缺点则是序列化的结果可读性不高。方法二:Proto Marshal的方式序列化结构体。方法一:JSON Marshl的方式序列化结构体。接下来我们编译成pb.go文件。原创 2023-07-22 21:47:49 · 478 阅读 · 10 评论 -
Go语言开发小技巧&易错点100例(七)
Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量。传递数据使用指针,而无须拷贝数据。因此大家就可以将程序退出前想要执行的函数放在defer函数中或者放在原创 2023-05-02 21:46:32 · 1071 阅读 · 0 评论 -
Go语言开发小技巧&易错点100例(六)
打印日志的意义在于记录程序运行过程中的各种信息和事件,以便在程序出现问题时能够更快地定位和解决问题。日志可以记录程序的输入、输出、异常、错误、性能指标等信息,帮助开发人员和运维人员快速发现问题,进行调试和优化。此外,日志还能为程序运行提供审计和监控的功能,方便对程序的运行情况进行分析和评估。而有时候我们在自己调试的时候可以使用控制台进行灵活的打印,但是如果到了线上的生产环境,光有控制台打印往往是不够的,需要通过文件持久化才方便在需要排查问题时进行随时查看。原创 2023-04-09 09:40:42 · 610 阅读 · 0 评论 -
Go语言开发小技巧&易错点100例(一)
今天给大家带来的这一档文章呢,主要是总结一下自己Coding过程中遇到的问题以及平时读一些博客的所得,因为做gopher也有了一段时间了,相比Java,有些问题的出现想要利用搜索引擎排查出来可能不是那么的迅速,所以在这里以文章的形式总结出来也方便各位初出茅庐的gopher们能够顺利的解决所遇到的问题,并能够习得一些小技巧。原创 2022-10-15 15:34:13 · 1116 阅读 · 8 评论 -
Go语言开发小技巧&易错点100例(四)
(1)goroutine控制并发数量的方式【技】(2)Go发起HTTP请求【技】(3)包循环依赖导致的异常【易】原创 2022-12-24 20:55:01 · 621 阅读 · 4 评论 -
Go语言开发小技巧&易错点100例(二)
第二期~原创 2022-11-05 20:34:20 · 711 阅读 · 0 评论 -
Go语言开发小技巧&易错点100例(五)
(1)pprof查看运行时状态信息【技】(2)goruntine使用后的销毁【易】原创 2023-01-15 22:22:45 · 561 阅读 · 12 评论 -
Go语言开发小技巧&易错点100例(三)
这么快就第三期了,算下来这期包括前几期我的《Go语言开发小技巧&易错点100例》已经凑够了15个!任务完成率15%!继续加油!原创 2022-12-03 22:24:53 · 661 阅读 · 4 评论