- 博客(125)
- 收藏
- 关注
原创 9 Go Module 依赖图是如何构建的?源码解析
本文深入解析了Go语言模块依赖图的构建机制。文章指出依赖图由模块节点和require边构成,主模块的依赖声明是构图起点。详细剖析了依赖图构建的核心流程:通过递归读取各模块的go.mod文件获取require列表形成边,并处理replace规则和缓存优化。特别强调replace仅改变内容来源而非图结构,indirect注释不影响版本选择但参与模块维护。文章还解释了图剪枝机制如何实现按需加载,以及依赖图如何为MVS算法提供输入以生成最终构建列表。最后总结了常见错误类型和处理思路,完整呈现了Go模块依赖解析的核心
2026-01-15 21:15:00
1272
原创 深入 `modload`:Go 是如何加载并解析 module 的
摘要 本文深入解析Go模块加载机制的核心组件modload,基于Go 1.25.0源码分析其工作原理。modload主要负责构建模块依赖图、确定构建列表(build list)和模块路径映射,而不涉及编译或包语义分析。其核心流程包括: 初始化执行环境:判断当前处于普通模块模式还是workspace模式,确定主模块和根目录。 解析配置:读取go.mod/go.work文件,处理require、replace、exclude等指令。 构建依赖图:按需扩展模块依赖关系,利用MVS算法收敛版本,生成最终构建列表。
2026-01-14 20:45:00
1264
原创 从 `go build` 开始:Go 第三方包加载流程源码导读
Go Module 加载流程源码解析 本文基于 Go 1.25.0 源码,分析了 go build 命令中模块加载的核心流程。主要包含: 调用链分析:从 main.go 入口到 build.go 核心逻辑的执行路径,重点介绍了 modload.LoadPackages() 作为模块加载的总调度。 关键函数解析: LoadPackages() 负责收集所有依赖包、区分第三方包、解析 import path 通过 importFromModules() 实现最长前缀匹配规则 核心流程: 构建依赖图并应用 MVS
2026-01-09 22:00:00
765
原创 Go Module 的版本选择算法:Minimal Version Selection(MVS)
摘要: Go Module的版本选择机制采用Minimal Version Selection(MVS)规则,核心是在满足所有依赖约束的前提下,为每个模块选择最低可用版本。常见反直觉现象(如不自动升级最新版、间接依赖连锁变化等)均源于MVS的工程化设计: 规则本质:从依赖图中收集所有模块的最低版本要求,同一路径选最高版本,确保满足所有约束; 关键特性:不主动追新、升级需明确来源、不自动回退,保证构建的确定性和单调性; 特殊标注:// indirect仅表示间接引用,不影响版本选择逻辑;replace/exc
2026-01-05 19:45:00
985
原创 Go 在哪里找第三方包?Module 查找顺序详解
Go 编译器查找代码包的顺序遵循严格的优先级:1) 检查是否属于主模块(Main Module)本地代码;2) 查看go.mod中的replace指令;3) 检查vendor目录(若启用);4) 查找$GOPATH/pkg/mod缓存;5) 最后通过GOPROXY下载。这个流程解释了为何有时修改不生效或找不到包,帮助开发者准确定位问题环节。标准库优先从$GOROOT查找,而主模块代码优先级高于远程依赖,replace指令能强制覆盖默认路径,vendor模式会完全忽略缓存和网络。
2026-01-04 11:13:19
604
原创 Go 是如何解析 `import path` 的?第三方包定位原理
Go import路径解析机制详解:从import字符串到磁盘目录的完整映射过程。文章首先区分了标准库、本地包和第三方包的不同处理逻辑,重点阐述了第三方包的归属判定规则——通过最长前缀匹配确定所属module,再拼接相对路径定位源码目录。文中揭示了关键难点:module边界由go.mod定义而非仓库结构,解释了多module仓库、子目录module和v2+版本等特殊场景的解析逻辑,并分析了同一import路径在不同项目中可能指向不同代码的原因(build list版本差异和replace指令影响)。
2025-12-28 10:30:18
761
原创 Go Module 基础概念全解析:module、version、sum 是什么
本文深入解析了Go Module中的核心概念:module、version和sum。module是Go依赖管理的基本单位,由go.mod文件定义边界;version指定具体的版本实例,遵循语义化版本规则;sum通过go.sum文件确保依赖内容的完整性和一致性。三者共同作用:module定边界,version定实例,sum定内容。文章还澄清了常见误区,如module不等于仓库、require不等于锁版本、go.sum不是依赖列表等,帮助开发者准确理解Go依赖体系的设计原理。
2025-12-26 18:19:00
922
原创 从 GOPATH 到 Go Module:Go 依赖管理机制的演进
Go依赖管理演进:从GOPATH到Go Module Go依赖管理经历了三个阶段: GOPATH时代:依赖全局存放,简单但无法锁定版本,导致构建不可复现、项目互相污染。 Vendor补丁:通过项目内拷贝依赖解决一致性,但带来代码冗余和更新困难。 Go Module:官方方案通过go.mod显式声明依赖、go.sum校验内容,实现版本控制与缓存复用。 演进核心是平衡简单性与可复现性:GOPATH极简但不可靠,Vendor稳定但笨重,Go Module最终统一机制,将依赖管理内化为语言工具链能力,支持可协作的大
2025-12-25 12:22:33
650
1
原创 一个 import 语句,引发的 Go 第三方包加载之旅
Go依赖管理机制解析:从import到编译的全流程本文系统梳理了Go语言依赖管理的工作流程,从基础概念到实际构建过程,帮助开发者理解Go模块化设计的底层原理。文章首先区分package与module的核心差异,随后详细解析import语句从查找、版本选择到最终编译的完整流水线。重点剖析了go.mod声明、go.sum校验和环境变量配置三大关键环节对构建结果的影响,并提供了排查依赖问题的系统化思路。最后预告了系列文章的后续内容,将深入版本选择算法、私有仓库处理等高级主题,旨在帮助开发者从"会用"进阶到"理解
2025-12-24 20:00:00
1024
1
原创 用了 Cursor 半年,我总结了这些让代码写得飞起的技巧
本文分享了使用 Cursor AI 辅助编程的经验总结,重点介绍了基础配置、提示词工程和进阶技巧。在基础配置部分,强调了.cursorignore文件的重要性以避免无关文件污染上下文,以及如何通过.cursorrules定制编程规范。提示词工程部分提出了"目标+具体要求+约束条件"的黄金公式,并建议将AI视为兼具实习生和老师双重角色。进阶技巧包括AI辅助测试驱动开发(TDD)的实践方法。全文提供了大量实际案例,帮助开发者更高效地利用AI工具提升编程效率和质量。
2025-10-22 14:48:26
1533
原创 golang编译的程序在windows上运行报错:此应用无法在你的电脑上运行,若要找到适用于你的电脑的版本,请咨询软件发布者。dwarf5
摘要: Go 1.25 默认启用 DWARF v5 调试格式,带来更精确的调试信息和支持复杂数据结构,但可能导致 Windows 兼容性问题(如 PE 格式限制或安全机制冲突)。解决方法是设置环境变量 GOEXPERIMENT=nodwarf5 或运行 go env -w GOEXPERIMENT=nodwarf5 回退到 DWARF v4。GOEXPERIMENT 是 Go 的实验性特性控制开关,支持按需启用/禁用未稳定功能(如内存区域、循环变量优化等),可通过 go version 查看生效配置。
2025-10-17 11:26:32
1088
原创 免费的 CI/CD 服务,了解一下 GitHub Actions ?
GitHub Actions 是 GitHub 提供的持续集成服务,可自动化软件开发流程。文章介绍了其核心概念(工作流、任务、步骤等)和优势(深度集成、免费额度等),详细解析了 YAML 配置的基本结构、触发方式(Push/Pull Request/定时/手动)以及常用功能(环境变量、矩阵策略等)。最后提供了四个实用场景示例:前端项目 CI/CD、后端测试、自动发布版本和定时任务,展示了 GitHub Actions 在自动化构建、测试和部署中的灵活应用。通过 GitHub Actions,开发者可以显著提
2025-09-30 15:39:52
1366
原创 go 中 time.Since 失效,手动修改系统时间后不生效?(time 包的单调时钟设计)
Go语言中time.Since()方法使用单调时钟设计,确保时间差计算不受系统时间修改影响。当测试人员修改系统时间后,预期操作未触发,这是因为time.Now()同时记录了系统时间和单调时钟(基于系统启动时间)。通过分析源码发现,time.Since()优先使用单调时钟计算,从而避免系统时间篡改导致误差。解决方案是使用time.Unix()或Truncate()方法去除单调时钟信息,使时间差计算依赖系统时间。这是Go语言的时间包设计特性,旨在提供更可靠的时间间隔测量。
2025-09-27 09:20:34
435
原创 RAG 从入门到放弃?丐版 demo 实战笔记(go+python)
RAG(检索增强生成)技术结合了搜索引擎和大语言模型,通过向量数据库检索相关数据并构建提示词,提升大模型在特定业务场景下的回答质量。该技术适用于数据规模大、时效性要求高、多租户隔离等场景。文章提供了一个基于Go的本地化RAG实现Demo,包含权限控制、向量检索和智能问答功能,使用Qdrant向量数据库和Ollama+Llama3/DeepSeek本地模型。核心流程包括个性化查询处理、权限过滤的向量检索及提示词构建,支持完全本地化部署,适用于需要数据隐私和定制化AI助手的业务系统。
2025-09-13 17:59:57
1162
4
原创 AI Coding 真能让程序员「开挂」吗?
最近看到了 METR(一个研究 AI 能力的非营利性研究组织) 发布的一篇文章,AI 工具让资深开发者变慢 19%。再结合自己的实际使用 AI 工具进行编程的体验,简单谈一下我对 AI 编程的看法。工作,简单来说就是拿到问题 -> 检索知识库 -> 解决问题。由于程序员这个全体的无私,开源项目、知识分享,网络上基本上想找的知识都能找到,AI 其实能够帮助我们更快速地找到并学习未涉足过的知识领域,在这个阶段,提效真的很明显。
2025-07-18 17:53:51
741
原创 Cursor Rules 使用
Cursor Rules是用于规范AI编程助手行为的配置规则,分为全局(User Rules)和项目级(Project Rules)。通过设置代码风格、安全实践等约束,确保AI生成的代码符合项目规范。规则分为三个层级:通用规则(如缩进要求)、语言规则(如Python的PEP8遵循)和框架规则(如Next.js的API路由规范)。合理配置Rules可显著提升代码一致性,减少返工,并强制实施最佳实践,使AI成为更高效的开发助手。建议开发者根据项目需求精心配置Rules以获得最佳效果。
2025-06-07 09:29:30
2191
1
原创 阿里云服务器邮件发送失败(dail tcp xxxx:25: i/o timeout)因为阿里云默认禁用 25 端口
阿里云服务器上发送邮件超时的问题,是由于阿里云默认禁用25端口防止垃圾邮件,建议改用465或587端口连接SMTP。文中提供了Go语言示例代码,展示如何通过465端口发送邮件,并推荐了相关技术文章链接。
2025-05-29 12:29:04
940
原创 go 访问 sftp 服务 github.com/pkg/sftp 的使用踩坑,连接未关闭(含 sftp 服务测试环境搭建)
本文分析了使用Go语言sftp库时出现连接泄漏问题,指出仅关闭sftp.Client而不关闭底层的ssh.Client会导致SSH连接未释放。通过代码示例展示了正确关闭连接的方法。同时介绍了使用Docker搭建sftp测试环境时遇到的两个常见问题:权限设置和密钥配置,特别强调了宿主目录权限需要匹配容器内用户UID/GID,以及必须放置正确的公钥文件到映射目录。文章为开发者提供了sftp连接管理和测试环境搭建的实用指导。
2025-05-24 10:11:25
1295
原创 dockerfile: PaddleOCR hubserving api 服务
本文介绍了如何通过 docker 快速部署基于 PaddleOCR 的 OCR API 服务。文章提供了详细的 dockerfile 内容,包括基础镜像选择、依赖安装、模型下载与解压、服务启动等步骤。用户只需按照步骤构建镜像、运行容器,并通过 curl 命令测试服务。文中还特别提醒了模型路径的配置和图片 base64 字符串的处理方式。通过本文,用户可以轻松部署一个功能完善的 OCR 服务。
2025-05-12 14:56:59
902
原创 docker容器中go访问https出错tls: failed to verify certificate: x509: certificate signed by unknown authority
docker容器中访问https,是缺少了CA证书,在制作镜像时要记得添加一下证书。
2025-04-24 15:01:48
2905
原创 go 编译的 windows 进程(exe)以管理员权限启动(UAC)
windows系统,在打开某些exe的时候,会弹出“用户账户控制(UAC)”的弹窗 “你要允许来自xx发布者的此应用对你的设备进行更改吗?UAC,用户账户控制)是Windows操作系统中的一个安全组件,如果程序未通过管理员权限启动,可能会导致应用程序发生错误。本篇简单介绍 2 种在go中以管理员权限启动程序的方式。
2025-04-22 17:43:56
983
原创 字符编码,计算机是如何认字的(ASCII,Unicode,UTF-8,GBK 都是些什么)
最近遇到了几个编码转换的问题,为什么会出现乱码呢?就想搞清楚计算机是如何“认字”的,查查资料进行总结。提一嘴bit(位),计算机中数据的最小单位,0或1。byte(字节),1 byte = 8 bit。字符,例如:A,1,国 等具体的文字符号。
2025-01-23 18:49:07
1254
原创 Android adb 调试,不在手机上点击信任 “允许usb调试” 即可连接的方式(手机需root)
通过更改手机的 /data/misc/adb/adb_keys 文件来达到直接信任电脑的效果。
2025-01-16 13:58:25
3269
1
原创 mysql 数据表导出为 markdown(附 go 语言 gorm 的实际使用)
通常业务系统开发中,数据库的设计与维护是至关重要的环节。而数据库的文档化则是确保团队成员之间有效沟通、快速理解系统架构的基础。mysql_markdown 工具将 mysql 数据库表导出为 markdown。
2024-11-22 10:45:38
708
2
原创 minio 使用 PostPolicy 方式上传文件
PostPolicy是一种用于生成预签名的POST请求的方法,允许客户端直接向S3兼容的存储服务(如MinIO)上传文件,而不需要通过后端服务器中转。可以在PostPolicy中设置各种条件,如文件大小限制、文件名前缀等。本篇简单介绍了下minio直接从客户端上传文件的另一种方式PostPolicy,并附上了示例代码。用户拿到sts临时凭证后随意上传文件,这个没法控制,如果真有人拿到了临时凭证恶意上传大文件,导致oss服务不能用了,那只有通过法律的铁拳来打击了。
2024-11-19 18:56:05
1040
原创 云手机简述(概况,使用场景,自己部署云手机)
云手机(Cloud Phone)是一种基于云计算技术的虚拟手机服务,它将手机的操作系统和应用程序托管在云端服务器上,用户可以通过互联网连接来访问和操作这些虚拟手机。与传统的智能手机不同,云手机不需要依赖物理硬件,用户可以使用多种设备(如智能手机、平板电脑、笔记本电脑等)通过互联网访问和使用云手机服务。
2024-10-28 14:11:02
5138
原创 Gitlab 中几种不同的认证机制(Access Tokens,SSH Keys,Deploy Tokens,Deploy Keys)
Gitlab 中几种不同的认证机制解析,并介绍了在做 CI 时,Docker 镜像中如何用 Go 拉取私有仓库的代码。
2024-09-12 15:04:07
6059
原创 MinIO实战攻略:轻松构建私有云存储解决方案
OSS(Object Storage Service)通常指的是对象存储服务,它是一种数据存储架构,用于存储和检索非结构化数据,如图片、视频、文档和备份等。对象存储服务与传统的块存储和文件存储不同,它将数据作为对象来存储,每个对象都包含数据、元数据和一个唯一的标识符。在对象存储系统中,数据被组织成一个扁平的结构,而不是传统的文件系统中的层级结构。高扩展性:可以轻松地扩展存储容量,以适应不断增长的数据量。高可用性:通常提供冗余存储,确保数据在硬件故障时仍然可用。
2024-08-23 17:34:27
1371
2
原创 【记录】go 设置 http 请求超时
平常自己使用http发送请求设置超时,都是直接给对象设置Timeout属性,很少使用这种对单个Request设置超时的。其实还是个熟练度问题,平常源码读的比较少。有空读读源码不仅可以在使用代码的时候更得心应手,也能够学习借鉴源码的代码设计实现。对自己平常经常需要使用的库,还是建议都过一遍源码,很不错的一个打发空闲时间的方式。
2024-08-09 17:59:47
897
原创 AI 编程辅助工具介绍
2023 被称为“AI元年”,人工智能、AI大模型概念迅速点燃市场。对程序员来说,如果能让 AI 帮助我们编码,那工作效率不得起飞!本篇简单介绍一下当前主流的 AI 编码工具。目前的 AI 辅助编程工具还在飞速发展,本地部署训练的效果都不如 GitHub Copilot 等大厂的产品好用。短期内建议使用云服务产品来做代码辅助,长期考虑,可以先本地部署了解下其原理(硬件不行的就不要再考虑了),尝试自己生成模型。
2024-04-16 15:46:27
2547
原创 【开发掉坑】go 中 interface 的 nil 判断
今天介绍下 `go` 中的 `interface(any)` 的 `nil` 判断,项目中遇到的一个小问题,知识遗忘了,再做个记录。
2024-01-19 15:27:50
1182
原创 go module 名称与 GitHub/Gitlab 地址不同时的引用方式(module declares its path as: github.com/someone/repo )
本篇介绍了go引用第三方库时,当module名称和引入仓库地址不同的情况下的解决方式:使用mod的replace特性。使用replace将替换成网站地址即可。module declares its path as: github.com/someone/repo but was required as: github.com/you/repo 的解决方式
2023-11-06 17:22:09
2341
原创 golang 发起 http 请求,获取访问域名的 ip 地址(net, httptrace)
本篇介绍了在go中如何获取访问域名的ip地址,通过go官方net包可获取。如果有记录http请求的域名ip这种需求,可以使用go 1.17后添加的httptrace包来插入钩子获取请求的ip地址。当然了,httptrace的作用不止于此,它可以搜集http客户端请求整个生命周期中的信息,本篇未做详细介绍,感兴趣的可自行探索。
2023-11-02 10:40:15
3202
1
原创 电子邮件发送接收原理(附 go 语言实现发送邮件)
本文阐述了电子邮件发送接收原理。大体流程:用户A-> 邮箱服务器 (-> 其他邮箱服务器) -> 用户B。最后介绍了下使用golang来发送邮件,配置好服务器后还是很方便的。
2023-10-25 18:42:10
1581
原创 docker 已经配置了国内镜像源,但是拉取镜像速度还是很慢(gcr.io、quay.io、ghcr.io)
docker拉取镜像慢,通常配置了国内镜像源后,速度可以得到极大的改善。但若是配置了镜像源后,拉取镜像还是非常慢,那就需要自己想想办法搭个梯子直接从外网拉取镜像。
2023-09-13 11:07:01
19410
4
原创 git submodule 子模块的基本使用
使用了submodule后,若不主动更新,项目会一直使用固定版本的submodule模块,需手动更新(若是在go或者其他有包管理的项目中,建议还是使用开发语言工具去做这种类似的第三方包管理会比较方便。
2023-08-31 16:04:54
1626
原创 linux 性能分析之内存分析(free,vmstat,top,ps,pmap等工具使用介绍)
linux 的内存分析工具的简单使用。/proc/meminfo,free,vmstat,top,ps,pmap
2023-08-21 22:58:31
5330
原创 flutter 解压 zip 中文乱码问题处理
很简单的一个zip包解压缩的功能,但是windows平台中文显示乱码,很糟心,搜了一圈没找到现成的方法,在此贴上我的解决方式。
2023-08-11 16:05:53
1421
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅