- 博客(75)
- 资源 (2)
- 收藏
- 关注
原创 深入理解 Go 的多返回值:语法、编译原理与工程实践
本文深入解析了Go语言多返回值的设计原理和实现机制。从语法层面看,Go的多返回值是函数签名的一部分,而非元组解包。编译器通过返回值列表和ABI规范直接支持多返回值,在底层通过寄存器或栈空间传递结果。文章对比了命名返回值与普通返回的区别,揭示了defer修改命名返回值的原理,并分析了多返回值在性能上与struct的差异。最后总结了Go采用多返回值的设计哲学——为错误处理提供显式、安全的机制,以及常见工程实践中的使用模式和注意事项。多返回值作为Go的核心特性,体现了其简洁高效的语言设计理念。
2026-01-04 16:54:46
283
原创 2025 技术年终总结|近七年 Golang 工程实践、AI 应用落地与技术创作回顾
本文对 2025 年的技术工作与创作进行了系统总结。作为一名拥有近七年 Golang 开发经验的工程师,作者围绕 AI 技术实践与 Golang 工程经验两个核心方向展开回顾。文章首先介绍了 AI 在真实业务场景中的落地实践,包括基于 AI 对小红书旅行类内容进行地点信息提取并自动生成旅行路书的探索,该成果已成功应用并获得两项专利。随后,对全年在 CSDN 平台发布的 73 篇 Golang 原创技术博客进行了盘点,内容涵盖 Go 语言基础、并发模型、内存管理、性能优化及分布式工程实践。
2025-12-31 15:05:46
581
原创 Go 切片:nil vs 空数组 - JSON 序列化差异详解
特性var s []Ts := []T{}是否为 nil✅ 是❌ 否❌ 否JSON 序列化null[]长度000容量000(可指定)内存分配无有(最小)有append 安全✅ 是✅ 是✅ 是range 安全✅ 是✅ 是✅ 是API 响应推荐❌ 否✅ 是✅ 是。
2025-11-20 11:59:39
573
原创 Go 并发安全与 atomic.Value 在配置热更新中的最佳实践
场景推荐方案简单计数器 / 状态变量多 goroutine 并发写 mapsync.Mutexsync.Map配置数据热更新atomic.Value + 整体替换总结atomic适合基础类型;适合“整体替换”的不可变数据;想并发修改 map?用锁或sync.Map。
2025-10-24 11:27:55
1035
原创 Go语言中的信号量:用途、用法与实际场景-2
分布式锁的粒度应该与业务唯一性资源的范围保持一致,既不能太粗导致资源竞争严重,也不能太细导致锁管理复杂。问题点关键点总结锁粒度控制以业务唯一资源为单位,不宜过粗或过细TTL 设置大于业务处理时间,避免死锁/误触发,必要时可用续期机制(如 RedLock)慢任务优化加锁控制重复提交 + 异步后台处理 + 状态轮询反馈。
2025-05-31 12:30:00
321
原创 Go语言使用 Redis 实现分布式锁:应用场景与实践
在多实例部署或高并发系统中,为了防止同一个资源被重复操作(如重复下单、重复生成任务),我们需要一种“跨进程、跨节点”的资源访问控制机制,这就是分布式锁。工具/方式应用场景优点注意事项Redis 分布式锁多节点并发任务控制简洁、跨节点、自动过期死锁/TTL设置需合理,性能需考量幂等设计所有写操作接口核心设计原则,确保操作唯一性请求唯一ID必须可控、持久存储本地锁/缓存锁单机任务控制快速、轻量不适合分布式环境,多实例失效消息队列异步耗时任务弹性强,削峰填谷。
2025-05-31 00:45:00
1715
原创 Go语言中的信号量:用途、用法与实际场景
信号量是一种控制并发访问的计数机制,常用于限制资源访问的并发量。它的核心思想是:“允许同时进行的操作数量是有限的,超过这个数量的协程必须等待。在 Go 中没有内置的semaphore类型,但可以通过实现一个简易的信号量。
2025-05-30 15:22:09
443
原创 Kafka 和 RabbitMQ 介绍及在 Go 中的使用
Kafka是一个分布式流平台,主要用于高吞吐量、低延迟的数据流处理。它基于发布/订阅模型,用来处理大量的数据流。RabbitMQ是一个流行的开源消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议,提供可靠的消息传递功能。
2025-04-22 18:11:22
677
原创 Kafka 消息有序性 和 阻塞处理方案
设置相同的 key,Kafka 会根据 key 的 hash 值映射到固定分区。多个 consumer 去消费同一个分区,顺序就会被破坏。设置合理的 consumer 超时和 commit 间隔。保证同一个 key 的消息都进一个分区,自然就有序。增加 consumer 实例,提升消费并发度。,同一个分区内的消息是严格按顺序追加的,但。加速消费积压消息:暂停写入 + 拉快消费。提高消费速度,避免长耗时阻塞。分区,才能保证消费顺序。监控消息堆积量、消费速率。(内存 buffer)增加分区数量,分摊压力。
2025-04-22 18:10:27
614
原创 MySQL 死锁排查与解决方案
两个或多个事务在执行过程中,互相持有对方需要的锁,导致彼此都无法继续执行,形成永久阻塞。1️⃣ 发现死锁异常↓2️⃣查看死锁详情↓3️⃣ 分析死锁链、锁类型、冲突 SQL↓4️⃣ 确定高危事务,锁顺序、索引、执行顺序↓5️⃣ 优化 SQL、事务顺序、加索引、拆分事务↓6️⃣ 上线压测验证。
2025-04-22 18:05:35
721
原创 MySQL 常见索引失效场景
不要应该不要对索引字段做函数运算保持索引字段原样不要隐式类型转换保证类型匹配开头的 like 查询尽量用前缀匹配or 查询字段不全有索引用 union all 替代 or联合索引按顺序用遵循最左前缀原则。
2025-04-22 18:00:52
222
原创 MySQL 调优实战经历总结
慢查询日志 + EXPLAIN 永远是第一手武器没有银弹,SQL优化 + 索引调整 + 参数调优 + 架构设计多维度协同才是王道不迷信 ORM,复杂业务场景敢用原生 SQL定期巡检数据库慢日志和 QPS 峰值。
2025-04-22 17:57:28
318
原创 MySQL事务详解
事务(Transaction)是指一组操作,要么全部执行成功提交(commit),要么全部不执行回滚(rollback),是数据库保证数据一致性的重要机制。✅事务原子性靠 Undo Log + 两阶段提交机制保障,隔离级别控制事务并发可见性,InnoDB 默认 REPEATABLE READ 通过 next-key lock 解决幻读问题,ACID 特性是保障数据安全的一整套机制。
2025-04-22 17:52:51
489
原创 Redis 和 DB 数据不一致的解决方案
场景推荐方案缓存 + 数据库写不一致先更新库再删缓存 + 延时双删缓存穿透缓存空值 / 布隆过滤器缓存击穿永久热点 key / 互斥锁 / 延时双删缓存雪崩随机 TTL / 定时预热 / 多级缓存高可用一致性同步MQ 异步同步缓存允许最终一致性场景定时校验 + 延迟队列 + 延时双删| Redis 和 DB 的一致性,核心是延时双删缓存空值防穿透互斥锁防击穿随机TTL防雪崩MQ异步保证最终一致,按场景选方案,组合用,效果最佳。
2025-04-22 17:43:36
690
原创 Go 中 atomic 能解决 map 并发读写问题吗?
atomic 用于原子操作基础类型,不能直接保证 map 内部的线程安全。| | 替换 map 整体引用可以用,但不适合频繁读写的 map 场景。
2025-04-22 17:31:18
267
原创 Go 中 map 并发读写问题及解决方案
🔥 总结一句话:Go 原生 map 非线程安全,严禁并发读写,务必使用加锁、sync.Map 或 Channel保证并发安全。
2025-04-22 17:29:29
772
原创 Golang 单元测试实践与技术分享
本文将介绍如何使用 Go 语言编写高质量的单元测试,并解释相关的最佳实践。我们将通过一个完整的示例项目来演示如何编写测试、为什么这样写以及如何在日常开发中应用这些技术。编写良好的单元测试是保证 Go 代码质量的关键。通过表格驱动测试、全面的测试用例和清晰的错误报告,可以创建可维护且可靠的测试套件。为所有重要逻辑编写测试追求合理的测试覆盖率(通常80%以上)定期运行测试(可以集成到CI/CD中)将测试作为设计工具,帮助改进代码结构。
2025-04-15 16:07:30
1283
原创 Go pprof 性能分析使用说明文档
pprof 是 Go 官方内置性能分析工具,提供多种分析视图:CPU Profiling(CPU 占用分析)Memory Profiling(内存分配分析)Goroutine Profiling(协程分析)Threadcreate Profiling(线程创建分析)堆栈(Stack trace 快照)通过 HTTP 端口或文件采样,结合或 Web 火焰图直观分析程序性能瓶颈。功能命令内存 Profile火焰图。
2025-04-14 14:38:44
1212
原创 Go 中 Actor 模型与 GMP 模型的区别
在 Go 语言中,Actor 模型和GMP 模型(Goroutine、M 线程、P 调度器)是两种不同的并发编程模型。GMP 模型是 Go 语言运行时的核心调度机制,而 Actor 模型是一种并发编程的设计范式,通常可以在 Go 中使用 goroutine 和 channel 进行实现。每个 Actor 维护自己的状态。Actor 通过消息传递进行通信,避免了传统锁竞争问题。Actor 处理消息时是原子的,不会并发执行。:Go 语言的协程,每个 Goroutine 代表一个独立的任务。
2025-02-13 18:02:11
848
原创 Go中的Actor模型应用场景
Actor模型是一种并发计算模型,每个Actor都是一个独立的计算实体,它能够接收消息、处理消息并发送消息。Actor模型简化了并发编程的复杂性,通过消息传递来避免共享状态,从而使得并发的执行变得更为直观。
2025-02-13 16:43:17
799
原创 Go 中 map 的底层结构和扩容机制
Go 采用渐进式扩容策略,即每次插入或删除操作时,会迁移部分桶中的数据。:是存储键值对的桶结构,每个桶最多存储 8 个键值对。如果某个键值对被删除,其对应的桶不会立即清理,而是标记为。扩容时,旧桶中的键值对会根据新的哈希值重新分配到新桶中。:将旧桶中的键值对重新计算哈希值,并迁移到新桶中。可能会扩容,其键值对的内存地址可能会发生变化。中的元素数量增加时,为了维持高效的存取性能,:当某个桶的溢出链表过长时,也会触发扩容。:新桶数组的大小通常是旧桶数组的两倍。:扩容时,指向旧桶数组的指针。
2025-02-06 09:40:32
495
原创 Go之map的比较
在 Go 中,比较两个map是否相等需要手动实现逻辑或使用手动实现:通过检查长度、键和值是否相等,适用于简单的map,性能更高。:适用于复杂类型的比较,代码更简洁,但可能有性能开销。
2025-02-06 09:39:59
482
原创 提示词写作指南:如何更快让 AI 理解需求
清晰的任务描述:直接表达你希望执行的操作。提供范例:通过示例或模板帮助 AI 理解输出要求。设定风格或语气:影响内容的情感表达和语气。分步提示:将复杂任务拆分为多个步骤,逐步执行。设定输出格式:明确输出的结构,确保条理清晰。字数或时间限制:控制输出内容的长度和深度。关键词或要素列表:确保 AI 不遗漏任何重要内容。任务优先级:强调最重要的部分,确保任务重点突出。
2025-02-05 14:03:27
1541
原创 AI 提示词(Prompt)写作学习文档
写好 AI 提示词的关键在于明确性上下文的提供以及任务的精细描述。通过学习并掌握不同类型提示词的写作技巧,你将能够更高效地与 AI 互动,获得更符合需求的输出。
2025-02-05 13:53:32
1150
原创 Go之map的比较
在 Go 中,比较两个map是否相等需要手动实现逻辑或使用手动实现:通过检查长度、键和值是否相等,适用于简单的map,性能更高。:适用于复杂类型的比较,代码更简洁,但可能有性能开销。根据具体需求选择合适的方法,可以更好地平衡代码的可读性和性能。
2025-01-23 00:15:00
440
原创 Go之interface的比较
在 Go 中,两个interface底层类型是否相同:如果底层类型不同,则不能比较。值是否相等:如果底层类型相同且值相等,则比较结果为true。nil的处理:如果其中一个interface值为nil,则需要特别处理。可比较的类型:如果底层值是不可比较的类型(如切片、映射、通道),则不能直接比较。为了安全地比较interface值,建议使用类型断言或类型切换来处理具体的底层类型。
2025-01-23 00:00:00
521
原创 Go 中 defer 的底层数据结构和特性
defer的底层实现依赖于_defer结构体和 Goroutine 的链表。defer的执行遵循 LIFO 原则,最近声明的defer会最先执行。defer的参数在声明时计算,而具名返回值可以在defer中被修改。defer与panic和recover结合,可用于异常处理。理解defer的底层实现和特性,可以帮助你更好地使用它来管理资源、处理异常和简化代码逻辑。希望以上内容能帮助你深入理解 Go 中defer的底层实现和特性。
2025-01-22 00:00:00
374
原创 Go 中单引号、双引号和反引号的区别
标记类型特点单引号rune表示单个 Unicode 字符,类型为runeint32的别名)。双引号string表示字符串,支持转义字符,不可变,默认 UTF-8 编码。反引号string表示原始字符串,内容不会转义,支持多行文本,不可变。希望以上内容能帮助你更好地理解 Go 中单引号、双引号和反引号的区别和使用场景。
2025-01-21 13:48:06
697
原创 Go 中的 defer:执行顺序、修改返回值的时机及注意事项
defer的执行顺序为后进先出(LIFO)。defer在return之后执行,但在返回值被传递给调用方之前。defer可以修改命名返回值,但无法修改无命名返回值。在defer中可以捕获panic并使用recover恢复程序。defer的参数在声明时求值,而不是在执行时。理解defer的这些特性,可以帮助你更好地利用它进行资源管理和错误处理。
2025-01-21 13:43:02
900
原创 Go 语言中 for range 与闭包的陷阱及详细解释
闭包是一个函数和其周围的状态(词法环境)的组合。在 Go 中,闭包通常是指一个匿名函数,它可以捕获外部变量的值。例如:go复制在上述代码中,makeAdder返回了一个闭包,该闭包捕获了变量base,并可以在后续调用中使用它。在for range循环变量的作用域:循环变量的作用域是整个循环体,闭包捕获的是变量的引用,而不是值。陷阱表现:所有闭包可能捕获的是同一个变量的最终状态,而不是每次迭代时的值。解决方法在循环中创建局部变量副本。使用索引访问原始集合的元素。使用立即执行的闭包捕获当前值。
2025-01-21 11:56:42
929
原创 Go 语言中 for range 的地址变化分析
在for range中,循环变量是原始元素的副本,其地址可能在每次迭代时相同(Go 1.22 之前)或不同(Go 1.22 之后)。循环变量的地址与原始集合中元素的地址始终不同。在涉及取地址或闭包时,需特别注意循环变量的地址特性,以避免潜在的陷阱。
2025-01-21 11:47:16
549
原创 Go 语言中 Slice 和 Array 的区别
定义array是一个固定长度的序列,长度在声明时确定,且不可改变。声明方式go复制var arr [5]int // 定义一个长度为5的整型数组特点长度固定,一旦声明,长度不可更改。在内存中连续存储,可以使用索引快速访问元素。如果需要固定长度的序列且对性能要求极高,推荐使用array。如果需要动态调整长度的序列,推荐使用slice,其灵活性和强大的功能更适合大多数场景。
2025-01-21 11:35:45
746
原创 编程语言“鄙视链”背后的真相
编程语言的“鄙视链”现象,虽然源于语言特性和历史背景,但其背后反映的更多是程序员们对技术的偏见与认同。在团队协作中,如何化解语言间的误解与矛盾,是每个开发者需要面对的挑战。而从行业发展的角度看,“鄙视链”既促进了技术的多元化发展,也可能在某种程度上限制了创新。只有打破这种偏见,才能真正推动编程技术的进步。无论你偏爱哪种编程语言,最终的目标都是让技术为人类带来更多的便利与可能。
2025-01-20 17:57:52
550
原创 技术领导力:从代码执行者到团队掌舵人
技术领导力是指在技术领域中,通过自身的专业知识、技术能力和管理技巧,带领团队实现目标的能力。它不仅包括对前沿技术的掌握和应用,还涵盖了团队管理、沟通协作、战略规划等多方面的能力。具有技术领导力的程序员,不仅能够解决复杂的技术问题,还能通过有效的方式激励团队成员,推动项目的顺利进行。技术领导力是程序员职业发展的重要方向,它不仅能够提升个人的职业竞争力,还能为团队和公司带来更大的价值。
2025-01-20 17:47:07
764
原创 Mysql-CHAR和VARCHAR详解
是两种用于存储字符串的字段类型,它们的主要区别在于存储方式、长度限制、性能和用途。如果字符串长度小于定义的长度,系统会在右侧用空格填充(用于存储),但检索时会去掉填充的空格。存储空间利用率更高,只占用实际字符所需的字节数,加上 1 或 2 个字节的长度信息。在存储和检索时自动去除尾部的填充空格,可能会导致某些情况下的数据不一致问题。会固定分配指定长度的存储空间,无论实际存储的字符串长度是多少。:适用于长度不固定的字符串,比如文章内容、用户输入的备注等。如果定义的长度小于实际存储数据长度,数据会被截断。
2025-01-09 16:46:21
1013
原创 GoLand 中 Tabnine 插件的使用教程
Tabnine 是一款基于人工智能的代码补全工具,支持多种语言和集成开发环境(IDE)。在 GoLand 中安装并使用 Tabnine,可以显著提升代码编写效率,提供智能代码补全建议。
2025-01-09 00:15:00
2849
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅