- 博客(159)
- 资源 (4)
- 收藏
- 关注
原创 Go语言原子操作:atomic包全解析
Go语言中的原子操作是一种轻量级的并发同步机制,相比互斥锁具有显著性能优势。本文介绍了原子操作的核心概念、使用场景和基本用法,通过计数器示例展示了其并发安全性。性能对比测试表明,原子操作比互斥锁快2-5倍,平均提升45%的性能。sync/atomic包提供了四类原子操作函数:增减操作、比较并交换(CAS)、加载和存储操作。原子操作适用于简单数据结构的并发安全操作,如计数器和标志位,能避免线程阻塞和上下文切换,但适用范围较窄。
2025-12-24 20:30:00
948
原创 Go语言条件变量sync.Cond:线程间的协调者
Go语言中的条件变量(sync.Cond)为并发编程提供了高效的线程同步机制。本文介绍了条件变量的基本概念、使用场景和核心方法,重点分析了Wait()方法的工作原理。条件变量必须与互斥锁配合使用,通过Signal()或Broadcast()唤醒等待的goroutine。典型使用模式包括获取锁→检查条件→Wait()→执行操作→释放锁。文章通过代码示例演示了条件变量的工作流程,强调必须使用for循环而非if语句检查条件以防止虚假唤醒。理解条件变量的内部机制对正确实现goroutine间同步至关重要。
2025-12-22 14:35:43
622
原创 Go语言中的互斥锁:sync.Mutex与sync.RWMutex
Go语言中的互斥锁(sync.Mutex)和读写锁(sync.RWMutex)是并发编程中保护共享资源的关键机制。互斥锁通过Lock()和Unlock()方法实现独占访问,确保同一时间只有一个goroutine能访问共享资源。示例展示了银行账户的并发存取款操作,通过互斥锁保护余额变量。互斥锁内部采用状态字段和信号量实现,包含正常和饥饿两种模式,避免goroutine长时间等待。进阶用法包括尝试获取锁(非阻塞方式)和避免死锁的技巧(如转账时按固定顺序获取锁)。这些机制有效解决了并发访问中的数据竞争问题。
2025-12-13 19:30:00
629
原创 Go并发编程核心:channel和sync使用场景分析
Go语言通过goroutine和channel提供轻量级并发支持,其核心设计理念是通过通信共享内存。channel分为双向通道、只发通道和只收通道三种类型,使用make初始化并指定容量。关键操作包括发送、接收和关闭,未初始化的channel会导致永久阻塞。底层通过hchan结构体实现,包含循环队列、等待队列和互斥锁。相比Java和PHP的传统并发模型,Go的并发方案更轻量高效,单个 goroutine 内存占用仅为 KB 级,支持同时运行数十万甚至数百万个并发任务。
2025-12-05 16:19:26
969
原创 Go语言中如何实现线程安全的map
Go语言中的map是一种高效的key-value数据结构,但在并发场景下存在线程安全问题。本文分析了map的基本用法,包括key类型限制、struct作为key的注意事项、双返回值判断key是否存在等。重点探讨了map并发读写的解决方案:1)使用读写锁(RWMutex)保护map,适合并发读写频率适中的场景;2)分片加锁方案(如orcaman/concurrent-map),通过减小锁粒度提升高并发场景下的性能。文章提供了代码示例说明如何实现线程安全的map操作,并比较了不同方案的适用场景和优缺点。
2025-12-01 10:49:58
828
原创 在markdown中使用mermaid以源代码的形式生成各类图表
Mermaid 是一个基于 JavaScript 的开源图表工具,通过类 Markdown 语法实现文本到图表的转换。它支持思维导图、流程图、时序图、状态图等 20+ 图表类型,具有纯文本编写、跨平台兼容、版本控制友好等优势。文章详细展示了 12 种常见图表的语法示例和渲染效果,包括思维导图、基础/分支流程图、时序图、状态图、甘特图等,适用于技术文档、项目规划等场景。Mermaid 语法简洁,无需安装复杂工具,可直接在主流 Markdown 编辑器中使用。
2025-11-27 14:12:18
1071
原创 Go并发编程核心:Mutex和RWMutex的用法
Go语言中Mutex和RWMutex是处理并发安全的关键机制。Mutex通过Lock()和Unlock()确保临界区代码互斥执行,解决共享资源竞争问题。MySQL 的锁与 Go 锁本质一致,只是面向的共享资源不同:Go 的锁保护内存中的变量,解决进程内 goroutine 的并发冲突;MySQL 的锁保护磁盘上的数据行/表,解决多客户端事务的并发冲突;在分布式系统中,MySQL 锁和 Redis 锁又常常用于解决跨服务的数据竞争问题。
2025-11-24 21:14:36
96
原创 程序员应该了解和掌握的数据安全基本常识
数据安全的核心在于保护数据的机密性、完整性和可用性(CIA三元组)。机密性确保数据不被泄露,完整性防止数据被篡改,可用性保证服务正常运行。保护数据通常分为三个步骤:身份认证、权限控制和操作审计。常用的加密方法包括对称加密(共享密钥)、非对称加密(公私钥对)和哈希算法(数据指纹)。对称加密适合大量数据,非对称加密用于安全传输密钥,哈希算法则用于验证数据完整性。实际应用中,企业会根据业务需求侧重不同的安全维度。通过合理的加密技术和安全管理流程,可以有效保护各类数据免受威胁。
2025-11-23 10:30:00
38
原创 编码规范落地指南:什么才是高质量代码
本文系统阐述了高质量代码的核心特质与实现路径,指出优秀代码应具备经济性、规范性和安全性三大特征。通过对比不同语言(如PHP、Java、Go)的代码案例,揭示了过度追求简洁反而降低可读性的问题,强调结构化逻辑的重要性。文章提出了五道代码质量防线:开发者自我约束、工具赋能校验、代码评审、回归测试和上线监控,并详细说明了各环节的具体实践方法。最后指出程序员需具备理解语言设计理念、掌握工具链等六大素养,才能真正产出高质量代码。全文结合具体技术示例,为开发人员提供了提升代码质量的系统性指导方案。
2025-11-21 22:00:00
37
原创 消息队列三大核心难题:丢失、积压与重复消费的解决方案
本文探讨分布式系统中消息队列的三大典型问题:消息丢失、消息积压和重复消费。针对消息丢失问题,提出了端到端可靠性保障体系,重点介绍了生产者端的双重保障机制。通过本地消息表方案实现业务操作与消息发送的原子性,结合失败重试机制确保消息必达。文章提供了详细的数据库表设计和Golang代码实现片段,包括事务处理、定时重试任务等核心逻辑。该方案通过数据库事务将业务操作与消息记录绑定,并采用指数退避策略进行重试,有效解决了生产者端消息丢失问题,为构建高可靠的分布式消息系统提供了实践指导。
2025-11-15 08:51:24
802
原创 从零开始构建一个Go语言的SDK框架:实现e签宝合同签署
在企业级应用开发中,电子签名服务已经成为不可或缺的一部分,e签宝作为国内领先的电子签名服务提供商,为开发者提供了丰富的API接口。由于工作项目中需要使用go语言对接e签宝合同业务,目前也没找到第三方好用的e签宝go语言SDK,所以,干脆自己从零手写一个SDK,把项目中踩过的坑也汇总整理一下,方便后来人参考使用。同时,本项目也可以作为其它SDK的框架模板,稍作改动就可以用于其它业务。本文将以这个e签宝Go SDK为例,展示如何从零开始构建一个完整的Go语言SDK框架。
2025-10-19 13:00:00
1882
原创 用HTML+JS+高德API实现一个本地访问的景点地图
本文介绍了一个基于高德地图API开发的本地旅游景点地图应用。针对旅游年卡景点列表图片查看不便的问题,采用HTML+CSS+JavaScript技术栈,将景点数据整理为JSON格式,通过高德地图API批量获取坐标数据,并开发了一个纯静态页面实现景点地图可视化。无需服务器支持、直接打开HTML文件即可使用,方便用户直观查看所有景点位置信息。
2025-09-30 15:13:09
811
原创 Go-Zero API Handler 自动化生成与参数验证集成
本文介绍了如何通过自定义go-zero框架的代码模板实现自动化参数验证。开发者在使用goctl生成API服务时,通常需要在每个handler中手动添加参数验证逻辑,导致重复工作。通过修改handler.tpl模板文件,在请求解析后自动添加middleware.ValidateRequest验证逻辑,可以统一处理所有参数验证。该方法不仅避免了手动修改的繁琐,还能保证代码风格一致,特别适合需要统一验证的场景,有效提升开发效率和代码质量。
2025-09-25 17:53:37
562
原创 Go语言中 error 接口与自定义错误类型的深入解析
文章摘要:Go语言中自定义错误类型与接口的nil判断存在差异。当具体类型(*MyError)的nil赋给接口变量(error)时,接口包含类型信息而数据为nil,导致err==nil判断为false。解决方案包括:1)直接返回error接口类型;2)使用类型断言;3)利用errors.As()方法;4)必要时使用反射。性能上直接比较最快,反射最慢。最佳实践建议优先使用error接口,合理选择判断方式,避免不必要的反射操作。理解接口内部机制有助于编写更健壮的Go代码。
2025-09-16 15:22:53
390
原创 改造thinkphp6的命令行工具和分批次导出大量数据
本文介绍了ThinkPHP6框架中自定义命令行工具的基本用法和参数传递方法。主要内容包括:1)通过配置console.php和创建Command类实现自定义命令;2)使用addArgument方法传递顺序参数;3)使用addOption方法传递键值参数;4)通过继承BaseCommand类实现参数提示功能,覆写父类方法记录参数信息,便于开发时查看参数说明。文章提供了完整的代码示例,展示了如何创建带参数的命令行工具并实现友好的参数提示功能。
2025-08-27 18:15:02
838
原创 日常踩坑记:gorm的First方法查询数据为空返回的结果和error都不是nil
GORM查询数据时,First和Find方法在数据不存在时的处理差异值得注意。First会返回零值结构体和ErrRecordNotFound错误,而Find返回空数组且无错误。这种设计可能导致开发者混淆,建议统一处理逻辑。最佳实践是:使用First时要检查特定错误,使用Find时检查结果长度,或在查询前主动使用Count方法。这种差异反映了GORM在单条/批量查询时的不同设计理念,开发者需根据场景选择合适方法并注意错误处理。
2025-06-11 19:23:06
576
原创 golang使用gorm操作批量更新大量数据代码示例
本文介绍了一种批量修改银行网点数据表中ID值的方法。针对包含21万条记录的数据表,需要将id、parent_id和depth_ids三个关联字段统一增加3000,同时保持原有的层级关系。核心解决方案是:1)使用分页查询处理大数据量;2)通过CASE WHEN语句构建增量逻辑;3)采用分批执行策略避免数据库过载。特别是对depth_ids字段(存储逗号分隔的上级ID字符串),文中提供了完整的处理流程:字符串转数组→数值处理→还原为字符串。该方法通过Go语言实现,包含分页控制、批量更新和执行间隔等优化措施
2025-06-09 18:22:43
535
原创 golang项目中如何使用私密仓库的扩展包
在go项目中,一般会经常使用`import`关键词来引入第三方的扩展包,通俗的说,就是别人造好的一个轮子,我们直接拿来用。但是看,有些时候,我们需要引入一些私密仓库的扩展包,比如公司内部的仓库,不对外开放,如果像上面的方式直接引入的话就会报错。然后通过设置`go env`的`GOPRIVATE`以及~/.netrc文件的内容,就可以实现私密仓库扩展的使用。
2025-06-07 17:28:03
642
1
原创 复杂项目中通过使用全局变量解决问题的思维方式
接手一个老旧的PHP项目时,面对混乱的代码,我分享了一种解决问题的思路。首先,避免直接修改稳定运行的代码,尤其是当需要增加新功能时,传统的逐层传递参数方法不仅繁琐且容易出错。作者建议使用全局变量来简化参数传递,通过定义一个公共类文件并在链路的最上层直接赋值,从而避免中间链路的复杂传递。此外,还展示了如何通过全局变量收集日志信息,减少对原有代码的改动。这种思路不仅适用于PHP,也可应用于其他编程语言,帮助开发者更高效地处理遗留代码问题。
2025-05-22 17:40:50
1007
原创 go项目中操作数据库使用gorm和gen对比,附查询案例代码
查询数据的时候应该使用gorm还是gen呢?实际上,Gen是gorm里面的一个工具,或者说是在gorm的基础上做了更进一步的封装。GORM 和 GORM Gen 都是 Go 语言中用于数据库操作的工具,它们在功能和使用方式上存在一些区别。GORM 适合需要高度灵活性和对数据库操作有深入控制的场景,而 GORM Gen 则更适合快速开发和代码规范统一的项目。
2025-04-14 17:04:26
1359
原创 go-zero自动生成repository文件和测试用例
在软件开发中,尤其是在采用分层架构或者领域驱动设计(DDD)的项目里,repository(仓库)是一个关键概念,它起到数据访问层和业务逻辑层之间的桥梁作用,负责处理数据的持久化与检索,让业务逻辑层无需直接与数据库或其他数据存储交互。简单来说,repository 是一种设计模式,它把数据访问逻辑封装起来,让业务逻辑层和数据访问层解耦,从而提高代码的可维护性和可测试性。UserRepo 就是一个实现了该模式的具体类,它提供了对 User 模型的各种数据操作方法。
2025-04-10 16:47:43
1059
1
原创 go-zero使用elasticsearch踩坑记:时间存储和展示问题
通过go写入ES的示例,但是里面存在一个细节问题,就是写入的时间和ES展示的时间相差8小时的问题。导致这个问题的原因是时区设置的问题。由于写入到ES的时候没有特别设置具体的时区,ES会当成UTC时间处理,也就是认为写入的时间是UTC的2025-04-02 14:32:00,然而北京时间比UTC时间晚8个小时,那么,可以推测kibana页面上看到的应该是北京时间。
2025-04-03 17:20:12
1245
1
原创 go-zero中使用elasticsearch的示例
go-zero中使用elasticsearch的示例:模拟一个常见的业务,就是写入系统日志的功能,在go-zero中将系统日志写入到ES中。文件,这个文件中主要实现ES索引的定义和写入数据、以及查询数据的逻辑。
2025-03-04 10:04:28
922
1
原创 go-zero中定时任务的用法
在go-zero框架中使用定时任务调度的写法示例,首先需要用到的扩展:`go get -u github.com/robfig/cron/v3`,在这里我写上两个示例的定时任务,分别为“20秒打印一次SayHello”,以及“每一分钟查询一次当前用户总数”;可以轻松的在go-zero中实现定时任务的调度了,可以精确到秒级别。
2025-02-25 11:57:36
1014
原创 go语言简单快速的按顺序遍历kv结构(map)
在go语言中,如果需要对map遍历,每次输出的顺序是不固定的,多运行几次就会发现,每次运行后的顺序并不一致,因为go中的map的遍历是不保证顺序的。那么,直接在遍历的时候对key进行排序再按照key的顺序输出可以保证输出的都是按照key由小到大排序的结果。但是会存在缺陷。因此可以考虑存储为二维切片或结构体。
2025-02-12 18:43:29
649
原创 go-zero框架基本配置和错误码封装
每个层只需依赖这个上下文,而不需要直接处理底层的配置和初始化逻辑。是服务上下文的依赖注入,所有的配置项和数据库连接、以及业务逻辑所需的模型实例,都被集中管理在。接下来,我们把成功返回部分也优化一下,把原有的logic的成功返回部分改为统一封装的。上面只是配置了不同的env,还需要有一个方法来加载当前设定的env。同时可以新增如下配置文件,具体要在当前项目中运行哪个配置文件,修改。
2025-01-23 17:08:04
1188
原创 go-zero框架快速入门
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。go-zero 包含极简的 API 定义和生成工具 goctl,可以根据定义的 api 文件一键生成代码。
2025-01-06 15:31:07
3232
3
原创 go项目使用gentool生成model的gen.go问题
Gen Tool 是一个没有依赖关系的二进制文件,可以用来从数据库生成结构。出现这个情况,可能是这个工具的一个bug。如果改为生成全部表名,也不太方便,因为有时候其他小伙伴改动了某个表,不能随着当前版本上线,就会很被动。除非每次执行这个命令的时候,都要把之前已经有的数据表名都带上,会很麻烦。
2025-01-02 17:25:03
744
原创 使用PicGo和Gitee搭建自己的图床
我经常需要写一些技术文档,习惯使用Markdown来写文档。由于Markdown本质上是一种纯文本编辑器,它和传统的word或者其它富文本编辑器不一样,如果遇到插入图片的话,一般都是存放到文档本地,但是当文档移动到其它电脑,或者转发给其他人的时候,图片可能就会丢失。也就是说,将文档的图片存放到本地并不是一个明智的选择。因此,我决定寻找一些思路,将我的文档的图片存放到一个专门的图片仓库中。经过一些了解,我决定使用图床来存放我的文档的图片。
2024-12-20 15:52:27
1183
原创 在Ubuntu服务器上备份文件到自己的百度网盘
由于项目运行中会产生附件(比如图片、视频等二进制文件),一般情况下可以把网站的附件存储到OSS上,但是,OSS需要花钱,由于项目比较小,而且本着少花点钱的原则,还是把附件就放在了网站服务器上。那么,就需要考虑一个问题,附件文件的备份问题。如果服务器遭受攻击,那么有可能附件就找不回来了。
2024-12-11 18:23:52
1647
1
原创 macbook M1芯片(arm64架构)安装php的kafka扩展出错的解决方案
macbook M1芯片(arm64架构)安装php的kafka扩展出错的解决方案。M1芯片默认使用的arm64架构,在终端中执行命令 `arch -x86_64 zsh` 来切换架构,接下来,再重新安装 x86 的`brew、kafka、librdkafka、php-rdkafka` 就可以了。
2024-12-03 17:32:45
584
原创 Ubuntu搭建PHP开发环境操作步骤(保姆级教程)
最近自购了一个阿里云服务器,系统镜像为Ubuntu 22.04 ,在编译安装LNMP(nginx+php+mysql)环境的时候,踩了不少坑,因此决定把自己安装的过程记录下来,以备后用。本篇文章基本上属于保姆级别的教程,只要你的系统也是Ubuntu,基本上无脑式复制粘贴运行,就能搭建起LNMP的环境。
2024-11-21 10:06:41
2789
1
原创 thinkphp6中数据库的操作和增删改查导出Excel示例
thinkphp6中数据库的操作和增删改查导出Excel示例:直接导出的逻辑,先对数据列表的字段和表头设定,可以支持二维结构的解析;如果条件允许,还可以对生成的文件上传到OSS后,返回OSS的URL。如果需要导出数据表中的用户头像文件,和表格一起导出,可以对文件下载后生成压缩包。这里需要考虑到一个情况,如果导出的数据耗费的时间特别长(比如导出的数据量特别多,或者需要导出附件的时候),那么应该考虑通过消息队列异步导出。
2024-11-14 17:44:52
1224
原创 thinkphp6的项目结构配置和常用功能封装以及消息队列的用法
thinkphp6的项目结构配置和常用功能封装以及消息队列的用法。使用多应用模式,可以在一个项目中部署类似 admin、web、api 等多个应用;thinkphp 默认使用单应用模式部署,如果要使用多应用模式,需要安装多应用模式扩展think-multi-app。在 app/command目录下编写命令行脚本的逻辑,比如定时任务,或者比较耗时的执行脚本。thinkphp6 内置了一个消息队列服务 thinkphp-queue,它支持消息队列的一些基本特性:消息的发布,获取,执行,删除,重发,失败处理等。
2024-11-12 11:45:02
724
1
原创 Go语言Gin框架调用企业微信接口根据手机号获取userid
这篇文章主要是讲一下在Go语言Gin框架中对接企业微信获取数据的一个代码示例,主要涉及到Redis的基本用法、HTTP的GET和POST请求、对接企业微信接口获取数据并返回JSON。很多逻辑看似简单,但不能只看不练,只有多加练习,才能学以致用,融会贯通。先不要想着怎么把它做的最好,而是要先做出来v0.1版本,先别管好不好,先能运行起来,后面再慢慢优化。
2024-10-17 15:59:49
1474
2
原创 Go语言Gin框架的常规配置和查询数据返回json示例
在 上一篇文章中主要给大家分享了较多数据的时候如何使用go分页导出多个Excel文件并合并的实现方案,这一篇文章继续分享一下go语言的Gin框架的一些常规配置和业务中常用的查询数据库并返回json的实现方案。Gin是一个golang的微框架,基于 httprouter,具有快速灵活,容错率高,高性能等特点。借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。
2024-10-15 17:25:36
1617
原创 使用Go语言的gorm框架查询数据库并分页导出到Excel实例
使用Go语言的gorm框架查询数据库并分页导出到Excel实例,导出数据部分,考虑到数据量可能较大,如果一次性查询全量数据,可能造成内存或CPU爆满,因此不建议一次性全部导出,而是采用分页导出到多个文件,然后再将多个文件合并为一个Excel表格文件。
2024-10-09 16:20:09
1826
5
原创 2024年了,go xorm生成mysql的结构体这么操作
xorm是一个Go语言的ORM库,支持多种数据库,包括MySQL、PostgreSQL、SQLite、Oracle和SQL Server,并提供了丰富的查询语言。查了很多资料都和上面的解决方案类似,但是如今已经2024年9月了,我试了下上面的方案已经走不通了。后来根据xorm官网(https://xorm.io/) 的描述,现在需要安装`reverse`才能实现。踩了一些列坑之后,总结方法和操作步骤如下。
2024-09-20 17:13:37
1295
原创 数据库中的事务、undo log、redo log、binlog都是干啥的?
由于事务的机制比较复杂,涉及 redo log 和 undo log 的各种配合,所以需要考虑到事务执行过程的各种异常情况。当中途某个操作执行成功了,万一数据库宕机,数据库恢复过来之后会怎么处理这个事务。在 redo log 刷新到磁盘之前,都是回滚。如果 redo log 刷新到了磁盘,那么就是重放 redo log。如果 binlog 都已经提交成功了,那么就重放,否则就是回滚。如果回滚,用 undo log 来恢复数据。如果没有 undo log 就没有后悔药,没有办法回滚。
2024-06-25 15:04:10
1090
Postman_v4.1.3[Chrome插件]
2019-03-14
《Go语言编程》高清完整版电子书.pdf
2019-03-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅