go

MeetTanG15 小时前
后端·go
Go 实战锦囊|errgroup:优雅地管理并发任务组在 Go 的并发编程中,sync.WaitGroup 几乎是每个开发者的"启蒙工具"。但当任务需要错误传播、上下文取消和并发数量控制时,WaitGroup 就显得力不从心了。今天的主角——golang.org/x/sync/errgroup,正是为解决这些痛点而生的利器。本文将跳过玩具示例,直接聚焦生产环境中的最佳实践与隐蔽陷阱,并特别补充 Gin 框架下的适配要点。
名字还没想好☜15 小时前
开发语言·后端·golang·go
Go 标准库 flag 包实战:参数解析、子命令、自定义 Value 类型与默认值写 Go 命令行工具时,第一反应可能是直接撸 os.Args,自己按位置取参数。工具一简单还行,一旦要支持 -port=8080、-v、--config xxx 这种带名字的选项,手写解析立刻变成一坨 if-else,还要处理 -port 8080 和 -port=8080 两种写法、布尔标志、默认值……
天天喝旺仔18 小时前
分布式·http·微服务·rpc·go
gRPC 流式通信实战:从一元调用到双向流,吃透四种 RPC 模式(Go 版)做微服务时,最常遇到的不是"怎么调一次接口",而是"怎么持续地传数据":服务端要不停推送行情、客户端要批量上报日志、两边要像聊天一样来回发消息。用传统的"一问一答" HTTP 接口去硬套,要么轮询刷屏,要么把请求体撑成巨无霸。
明月_清风1 天前
数据结构·算法·go
从二叉树到 B+ 树:一文搞懂工程中「树」的演化之道本文系统梳理「树」这一核心数据结构,从基础概念到工程实践,全部代码用 Go 实现,带你搞懂为什么不同的场景需要不同的树。
江湖十年1 天前
后端·面试·go
在 Go 中使用 dyno 包处理动态对象我在《Go 语言中 YAML to JSON 踩坑笔记》一文中提到了使用 dyno 包来解决 json.Marshal 时遇到不支持的 map[interface{}]interface{} 类型报错的问题。本文就来通过源码的形式为大家详解一下 dyno 包的原理。
a187927218311 天前
算法·leetcode·go·剪枝·回溯·n皇后·算法讲解
【算法】回溯算法(三):三记重锤与 N 皇后——记忆化、状态设计与三层漏斗回溯系列第三篇,收官。上一篇以 LC842 验收"毕业",我以为真毕业了——接下来三记重锤锤醒了梦:记忆化的三次错位(417 万次调用 vs 176 次,缓存选择、缓存候选、只写不读一路踩过去)、排序被禁后的去重(层属性 vs 路径属性,usedThisLevel 不还原是精髓)、中间态失控(把 Go 的栈撑爆 1GB)。三锤全部指向同一件事:状态设计。最后用 N 皇后收官(对角线编号 r±c + 三个标记数组 + 四动作对),并把整个系列沉淀成三层漏斗识别框架和写题前的终极检查清单。本篇也是通往动态规划
纪卓志George1 天前
架构·go
打破语言范式:在 Go 里用动态代理实现 AOP代码仓库:github.com/jizhuozhi/g…Go 以简洁著称,却因克制的元编程能力,长期无法在运行时层面满足规模化系统开发对统一框架的需求——承载 AOP、依赖注入、可观测性等横切关注点。这一困境催生了社区持续的技术尝试,构成一条清晰的演进链:先是 go generate 驱动的编译期代码生成,mockgen、gowrap、GoAOP、go-spring 等莫不如此,却都停留在编译期元数据织入;而后字节跳动的 sonic 以运行时 JIT 突破了"在 Go 里生成机器码"的可行性边界,为运行时
码艺-Alimjan2 天前
java·javascript·python·算法·go
维吾尔语数字转文本完整代码在最下面封装到一个类里面大家随便用。在维吾尔语语音合成(TTS)和文本处理场景中,经常需要将阿拉伯数字转换为维吾尔语的自然读法。例如:
名字还没想好☜2 天前
开发语言·后端·golang·go
Go 时间格式化为什么用 2006-01-02:time.Format/Parse 的参考时间、时区与解析踩坑第一次用 Go 格式化时间的人几乎都会愣一下:别的语言里格式化字符串是 yyyy-MM-dd HH:mm:ss 这种占位符,到了 Go 变成了 2006-01-02 15:04:05。你甚至会怀疑是不是抄错了——为什么是这么一串看起来像随机日期的数字?
我的div丢了肿么办2 天前
后端·go
go语言中的map,map定义不同的数据类型,循环map,map的无序性把map[string]string 把它看做是一个对象 map等价于{}对象,[string]string等价于key:value的形式 因为map中读取是obje["key"],所以key的声明在括号里 整体如下: { key:value的形式,key是字符串,value也是字符串 } make([]map[string]string,3,3) 就等价于 make([]{ key:value的形式,key是字符串,value也是字符串 })
名字还没想好☜3 天前
开发语言·后端·golang·go
Go 1.21 context.WithoutCancel 实战:父 context 取消了,收尾任务还要继续跑HTTP 请求处理到一半,客户端断开连接,r.Context() 被取消——这是好事,能及时停掉没用的工作。但有个尴尬场景:你在这个请求里还想异步记一条审计日志、或者把结果写回缓存,这些收尾工作不该跟着请求一起被取消。Go 1.21 新加的 context.WithoutCancel 就是为这个来的。这篇讲清楚它解决什么、怎么用,以及顺带认识同批加入的 WithDeadlineCause 和 Cause。
newerp3 天前
后端·程序员·go
Golang 接口的两副面孔:eface、iface 与动态派发之谜var x any = 42 和 var s Shape = rect{} 看起来是同一种语法,但 Go 运行时为它们准备了两套不同的底层结构。今天拆开看看,顺便解开"nil 接口不等于 nil"这个坑了无数人的谜题。
明月_清风3 天前
后端·算法·go
递归算法:从原理到实战,一次讲透递归是编程世界中最优雅、也最容易让人"绕晕"的思维方式。很多人学完递归后,一遇到新题就发懵;或者写得出代码,却说不清为什么对。这篇文章,我们就把递归这件事彻底拆开讲透。
运维开发笔记3 天前
go
9.1 Go Interface 基础知识学习笔记接口是一组方法签名的集合,定义了"行为"但不实现:要点:Rectangle 和 Circle 都实现了 Area() float64 方法,因此它们都自动满足 Shape 接口:
a187927218313 天前
算法·leetcode·go·回溯·leetcode93·ip复原·算法讲解
【算法】回溯算法(一):从一道 IP 题到万能模板回溯系列第一篇,入门。从「复原 IP 地址」这道经典题出发,完整走一遍回溯的标准建模流程:把约束拆干净 → 画决策树 → 套三要素 → 三层剪枝 → 写代码 → 踩题内小坑。最后沉淀出一份可复用的回溯模板——八字口诀「判终、砍支、循环三连」,加上决策三形态和三验证。本篇是纯入门,一次车都不翻;翻车实录在第二篇,五个坑一个比一个深。
名字还没想好☜3 天前
开发语言·后端·golang·go
Go 用 -race 抓数据竞争:一个偶发崩溃的排查、原理与修复你的 Go 服务在本地跑得好好的,压测或上线后偶尔崩一下,报个 fatal error: concurrent map read and map write,或者更诡异——某个计数器统计出来的值总比实际少一点,重启又好了。这类"偶发、难复现、和并发有关"的 bug,十有八九是数据竞争(data race):两个 goroutine 同时访问同一块内存,其中至少一个是写,且没有同步。
Vespeng3 天前
架构·go·gin
打破传统 MVC:在 Go 中实践高内聚的业务驱动架构在 2025 年初,我曾写过一篇《Go 项目实战:搭建高效的 Gin Web 目录结构》,为刚从 Java 转型到 Go、面对极简的 Gin 感到无从下手的开发者,提供了一套基于传统 MVC(Controller-Service-Model)的平滑过渡方案,那套架构帮助了很多伙伴建立了工程安全感。
用户029669769823 天前
微信·go
摸着石头过河:我用Go把微信加密模块给逆向了一回说起来挺偶然的,手头有个小项目需要分析微信的通信协议,结果发现这玩意儿远不是抓个包就能搞定的。客户端内部用的Protobuf做了定制,外面还裹了好几层加密——AES-CBC打底,IV动态派生,中间再穿插XOR混淆,而且这些逻辑居然是用Go实现的,直接塞进了libwechat.so这样的共享库里。
idcu4 天前
开源·go·ai编程
CodeSchema 开源首发:一个给 AI 编码助手「喂」精准代码上下文的索引服务用 Cursor / Claude Code / Cline 写代码,上下文窗口经常被整仓库塞爆?token 哗哗烧、噪声一大模型还容易跑偏? 过去几个月我做了一个小工具 CodeSchema:把你的代码仓库「结构化索引」,让 AI 用到哪、取哪块,而不是动辄把整个仓库丢进 prompt。 这是它的第一次对外宣传。 它还不完美,所以更想发出来让真实场景去打磨。下文说实话、给步骤、留反馈入口。
newerp5 天前
后端·程序员·go
Golang 切片扩容策略当 append 向切片追加元素时,运行时会检查 Len + appended > Cap。如果超出容量,就必须扩容——分配更大的底层数组,把旧数据拷贝过去,然后把切片的 Data 指针指向新数组。