自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(11)
  • 收藏
  • 关注

原创 Go 聊天室踩坑:离线私聊消息,为什么非要我再 @ 一次别人才肯出现?

选型没啥好纠结的 ——Pub/Sub 人不在线消息直接丢,Stream 又杀鸡用牛刀,List 刚好对上 "先存着,人来了再取" 这个需求。我不打算在这里贴具体 diff,因为值得复盘的从来不是 "改了哪一行代码",而是 "我一开始为什么会误判、又是靠什么把范围缩小的"。一看到 "用户没看到",很容易下意识地回过头去怀疑入队、怀疑格式、怀疑是不是存错了地方,然后一通乱改,改了半天还在原地打转。我中间还栽过一次 "代码明明改了、行为一点没变" 的坑,最后一查 —— 跑的还是老进程的老二进制,白激动半天。

2026-11-07 15:42:57 227

原创 GitHub Fork + PR 完整流程

适合刚接触开源、第一次提交 PR 的同学

2026-10-17 09:23:30 249

原创 一文读懂 Dockerfile:从基础语法到常见踩坑总结

Docker 镜像采用 UnionFS 分层存储机制。简单理解:镜像层就是每一条构建指令生成的只读快照。基础镜像本身自带很多层,我们自己写的 Dockerfile 每执行一次操作,就会叠加一层新镜像。层数越多,镜像体积越大、构建越慢。所以写 Dockerfile 要尽量合并指令、减少层数。EXPOSE 只是声明端口,不会自动开放端口,端口映射需要 -p。RUN 在镜像构建阶段执行;CMD / ENTRYPOINT 在容器启动阶段执行,不要混淆执行时机。

2026-09-30 16:55:32 178

原创 接口组合vs结构体内嵌接口

Go中接口组合(type X interface{ Pet })与结构体内嵌接口(type X struct{ Pet })易混淆。前者是方法契约的组合,仅定义规则,不可实例化、不能返回或存储数据;后者是实体结构体,可存放对象、实现接口、支持嵌套和返回,具备装饰器模式能力。关键区别:接口是“规则”,结构体是“盒子”。结构体可拥有独有字段和方法,但接口无法访问其独有内容,需类型断言才能调用。掌握此点,彻底告别混淆。

2026-09-19 09:33:37 161

原创 从一坨烂代码到优雅工程:Go TCP通信项目低耦合、高可读实战重构复盘

编程的核心,从来不是“把功能跑通”,而是用清晰的结构、优雅的逻辑、极低的维护成本,实现功能。一个几十行的小项目,就能看出一个人的编码功底。从混乱堆砌到低耦合高可读,看似只是代码排版、拆分的优化,本质是从新手思维到工程化思维的蜕变。后续我会继续分享更多Go项目的重构复盘、网络编程避坑指南,也欢迎大家评论区交流自己的代码踩坑经历,一起告别烂代码!

2026-09-03 22:02:47 248

原创 一文吃透KMP算法:告别暴力匹配,解锁高效字符串匹配神器

next[i]表示:模式串前i个字符组成的子串,对应的最长相等前后缀长度。当模式串第i位字符失配时,模式串指针直接回退到next[i]的位置继续匹配。KMP算法的本质,就是用空间换时间:提前花费线性时间预处理模式串的前后缀规律,生成next跳转表,在匹配阶段彻底消除无效比对,实现线性时间匹配。暴力匹配回头重试,KMP算法聪明跳转。吃透前缀后缀、理解next数组、熟练匹配流程,就完全掌握了KMP的全部精髓。

2026-08-21 11:28:03 310

原创 我与 AI 一起写代码

无奈之下,我将完整源码发给 AI 分析,很快定位到问题根源:一处并发场景下互斥锁忘记解锁,高并发时直接造成死锁,连接逻辑阻塞。每当写完一个函数,我就交给 AI 做代码审查,标出潜在漏洞、不规范写法。发现问题后,我不会直接复制 AI 给出的修复代码,而是先独立思考出错原因,尝试手动修复,实在没有思路再参考提示。项目初期,我坚持全程手写代码。在实现 TCP 服务端监听、客户端连接管理、消息广播、并发处理等功能时,很多边界场景考虑不周,各种 BUG 层出不穷,不少模块反复推翻重写,调试耗费了大量时间。

2026-08-14 21:54:01 229

原创 Go网络编程学习小结

TCP通信流程:服务端用net.Listen监听端口,Accept阻塞等待客户端连接,每个连接开一个goroutine处理,通过Read和Write收发数据,最后关闭连接和监听。客户端用net.Dial连接服务端,直接Write发送、Read接收,最后关闭。TCP是有连接的可靠传输,但流式传输无消息边界,存在粘包问题,需自定义协议划分边界。客户端用DialUDP连接后,直接Write和Read。UDP无连接、不可靠,可能丢包,但数据报天然有边界,无需处理粘包,适合DNS、直播、游戏等对实时性要求高的场景。

2026-08-06 21:19:29 169

原创 完成GO基础后学习进阶的感想

然而,今天我发现了我的方法论,就是让Ai给我生成关于该阶段的代码,我照着代码学习,然后不会的小问题就去问TREA,如果不懂的话继续往下追问。到最后,我会让TREA给我出一道该小节或本阶段的代码题给我练练手,复习巩固知识点。同时我也会让TREA帮我总结一下,本小节的知识点。前一段时间完成了GO基础的学习,我以为后面进阶的学习会很简单,但是我后来发现GO进阶的学习好难。不是看不懂,而是琐碎的知识点记不住,一个接口的属性好多。我愁的头发都掉了好多。

2026-08-01 16:55:06 156

原创 Go 协程 goroutine 初探:新手极易踩坑的并发陷阱

goroutine 是 Go 运行时管理的轻量级执行单元,相比操作系统线程,它初始栈内存仅有 2KB,支持动态伸缩,能够轻松创建上万并发任务,创建、调度开销远小于 OS 线程。启动方式极其简单,在函数调用前增加 go 关键字: go func (){ fmt.Println ("执行协程任务") }()main 为主协程,main 退出,进程销毁,子 goroutine 不会等待;循环内 goroutine 搭配匿名闭包,警惕变量引用捕获问题;

2026-07-25 21:11:19 169

原创 GO接口的简单理解

不太理解接口,来看看低能儿的理解

2026-07-18 20:32:21 39

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除