Go版本升级实战:从GOROOT替换到工具链刷新与多版本切换
每次看到 Go 发布新版本总有人在社区里问怎么升级点进去一看回答五花八门有的让源码编译有的让卸载重装有的让等系统仓库更新。源码编译一次小半小时系统仓库又经常滞后几个版本——这两条路我都走过体验都很差。后来我摸清了 Go 的版本管理逻辑升级就变成了一件几分钟能搞定的事。这其实就是一篇写给开发者的快速升级实操记录从升级的本质是什么讲起覆盖 Linux、macOS、Windows 三套环境再补上升级之后工具链刷新、多版本切换、常见报错排查这些容易踩坑的地方。不管你是刚接触 Go 的新人还是被项目里的多版本需求折磨过的老手照着这套思路走完一遍基本就能把快速升级 Go 版本这件事彻底理顺。1. Go 升级的本质是替换 GOROOT 目录先搞清楚两个路径很多人在升级时犯的第一个错误是把它当成软件安装来处理于是去翻安装包、卸载旧版、跑编译脚本。实际上 Go 官方的分发逻辑非常朴素所有平台都提供预编译好的二进制发行包升级的全部动作就是把新的 Go 工具链放到指定目录替换掉旧的。1.1 GOROOT 决定版本PATH 决定命令能不能被找到先看两个关键概念。GOROOT是 Go 工具链安装的根目录Linux/macOS 下默认是/usr/local/go里面有bin/go、bin/gofmt、pkg、src等。你执行go version时看到的版本号其实就取决于/usr/local/go/bin/go这个文件本身是谁。PATH则是系统搜索可执行文件的路径列表。之所以能在终端里敲go就能跑命令是因为/usr/local/go/bin被加进了PATH。很多人升级完发现go version没变化就是被这两层关系迷惑了——要么新文件没放对位置要么PATH里还排着另一个旧版 Go 的路径。我打个比方GOROOT相当于工具箱放在哪个柜子PATH相当于你告诉系统去哪儿找这个箱子。升级就是换掉柜子里的整套工具而不是重新装修整间屋子。1.2 官方二进制包是快速升级的真正前提理解了 GOROOT 的逻辑就能明白为什么我不推荐源码编译编译 Go 编译器本身是为了给开发 Go 语言的人做贡献用的普通开发者完全没必要。官方在go.dev/dl上直接提供编译好的压缩包Linux 是tar.gzWindows 是zip或msimacOS 是tar.gz或pkg。这些包解压以后就是一个完整的go目录和现有/usr/local/go的结构完全一致。所以快速升级的核心操作就是把新的压缩包解压到 GOROOT 的位置覆盖或替换旧目录。整个过程不涉及卸载、不涉及残留清理比绝大多数语言运行时都要简单。1.3 动手前先记录三件事旧版本号、GOROOT、PATH正式动手前我建议你先花 10 秒钟做一次快照这能避免升级失败时一脸懵go version go env GOROOT echo $PATH记录下旧版本号、GOROOT 路径、PATH 里与 go 相关的条目。升级完成后如果出问题这三个值就是你排查的起点。我自己会把它们抄到终端上面的临时 notes 里反正也就三行。这一步看似啰嗦但我在帮同事排查升级问题时发现大部分人报升级失败其实是连旧版本装在哪、PATH 里有没有多个 go 都没确认过最后发现是自己环境配置本来就有问题。先做快照后面能省大事。2. Linux/macOS 上我常用的三分钟升级流程Linux 和 macOS 的升级逻辑一样都是替换/usr/local/go。我在生产服务器和本机都用这套流程跑了很多次基本稳定在 3 分钟左右。2.1 四步替换法备份、下载、解压、验证假设你要升级到 Go 1.24.4具体版本号以go.dev/dl上的最新版本为准在 Linux amd64 环境下执行# 1. 备份旧版本 sudo mv /usr/local/go /usr/local/go.bak # 2. 下载新版二进制包 curl -LO https://go.dev/dl/go1.24.4.linux-amd64.tar.gz # 3. 解压到 /usr/local会自动生成新的 go 目录 sudo tar -C /usr/local -xzf go1.24.4.linux-amd64.tar.gz # 4. 验证 go version这里有个细节要注意tar解压出来的目录名必须是go所以-C /usr/local解压后生成的就是/usr/local/go。正因如此第一步先把旧目录改名为go.bak就很有必要——如果旧目录还在解压会直接覆盖到一半文件可能导致目录处于混合状态。备份这一步不是保守而是性价比最高的回滚方案。升级后如果发现某个依赖不兼容新版一条命令就能退回旧版不用重新下载。2.2 一个可以直接存进 dotfiles 的升级脚本手动敲四行命令不难但每次都要记版本号、改下载链接挺烦的。我直接把整个流程写成了脚本参数就是目标版本号跑完自动验证#!/usr/bin/env bash set -euo pipefail VERSION${1:?用法: upgrade-go.sh 1.24.4} OS$(uname -s | tr [:upper:] [:lower:]) ARCH$(uname -m | sed s/x86_64/amd64/; s/aarch64/arm64/) sudo mv /usr/local/go /usr/local/go.bak.$(date %Y%m%d) curl -LO https://go.dev/dl/go${VERSION}.${OS}-${ARCH}.tar.gz sudo tar -C /usr/local -xzf go${VERSION}.${OS}-${ARCH}.tar.gz rm -f go${VERSION}.${OS}-${ARCH}.tar.gz go versionARCH那行做了个小处理macOS 的uname -m输出x86_64或arm64Linux 上如果是aarch64也能映射成arm64这样脚本在 Apple Silicon 和常见的 ARM 服务器上都能用。如果你用的是 Linux 386 这类少见架构手动改一下ARCH映射就行。备份名带上日期是为了避免/usr/local/go.bak被下一次升级覆盖。多个备份占点磁盘无所谓反正一个完整 Go 工具链也就一两百 MB关键时刻能救命。2.3 macOS 用户别盲目 brew upgrademacOS 上很多人第一反应是brew upgrade go。这确实能升级但有几个问题Homebrew 仓库的版本更新有延迟经常比官方晚几天甚至几周另外 Homebrew 版的 GOROOT 路径是/usr/local/opt/goIntel或/opt/homebrew/opt/goApple Silicon如果你之前装过官方 tar 包的版本两个 Go 同时存在于 PATH 里会出现版本混乱。我的建议是本机如果一直用 brew 管理的就坚持用 brew升级命令简单如果需要第一时间用上新版本或者想用golang.org/dl的多版本工具就走 tar 包方案。不要混着来——混用的后果往往是go version显示一个版本which go却指向另一个路径排查起来最头疼。如果你之前用过官方 pkg 安装包还要检查一下/etc/paths.d/go这个文件pkg 安装器会在里面写入/usr/local/go/bin和 brew 的路径叠加后很容易出现顺序问题。3. Windows 上用 winget 和 MSI 快速升级的注意事项Windows 的升级路径和 Unix 系不太一样官方提供了msi安装包安装器会自动处理 GOROOT 和 PATH。但在实际环境里Windows 的坑恰恰出在自动处理这四个字上。3.1 最省事的 winget 命令Windows 10/11 自带winget升级 Go 只需要一条命令winget upgrade GoLang.Go也可以指定版本winget install GoLang.Go --version 1.24.4winget的 Go 包就是官方 MSI它会自动卸载旧版本并安装新版本同时更新系统 PATH。对于绝大多数 Windows 用户这是最不容易出错的方式因为不需要手动处理安装路径。如果你不想用命令行也可以去go.dev/dl下载 MSI 双击安装。两条路效果一样MSI 安装器会覆盖旧版本。3.2 旧版本残留导致的升级后还是旧版本我在 Windows 上遇到最多的升级问题是明明 MSI 显示安装成功打开终端一敲go version还是旧版。原因基本都是 PATH 里存在多个 Go 路径。常见来源包括手动配置过的GOROOT环境变量、非官方安装包写入的路径、以及旧版 MSI 卸载不干净留下的目录。Windows 的 PATH 是按顺序匹配的如果前面有一个旧版本的C:\Go\bin后面新的C:\Program Files\Go\bin就永远不会被用到。排查方式where.exe go这条命令会列出 PATH 中所有go.exe的位置按顺序显示。如果出现了多个路径就要把旧路径清理掉。具体操作是在系统属性 - 环境变量里编辑 PATH保留你确认要用的那一个其余删除。同时检查GOROOT用户环境变量如果它指向旧路径直接删掉这个变量——新版 Go 已经不依赖 GOROOT 环境变量了它能自己推导。3.3 环境变量 GOROOT 的特殊情况Windows 用户还要注意一点如果你在用户或系统环境变量里手动设置了GOROOT它会让某些工具链行为变得奇怪。新版 Go 在大多数情况下可以自动探测 GOROOT手动设置反而容易造成不一致。比如你升级后go version显示新版但go env GOROOT却指向一个旧目录大概率就是环境变量在作祟。我遇到过一个同事的问题GoLand 里编译正常终端里编译却报找不到 GOROOT最后发现就是GOROOT环境变量指向了一个已卸载的旧版本目录。处理原则很简单不要手动设置GOROOT除非你有非常明确的需求比如自定义安装目录。在 Windows 上把所有 Go 相关配置交给 MSI 安装器去管理问题最少。4. 升级之后别急着写代码工具链与项目联动升级完go version显示新版本很多人觉得就算完工了。但接下来有一连串联动项没处理后面写代码时会一个个冒出来。4.1 全局安装的 Go 工具需要重新编译到新版用go install装的全局工具比如gopls语言服务器、dlv调试器、staticcheck、golangci-lint这些本质上是针对特定 Go 版本编译出来的二进制。升级 Go 之后它们通常还能跑但可能存在兼容性问题最稳妥的做法是用新版本重新安装一遍go install golang.org/x/tools/goplslatest go install github.com/go-delve/delve/cmd/dlvlatest go install honnef.co/go/tools/cmd/staticchecklatest这一步很多人忽略直到编辑器提示gopls和 Go 版本不匹配时才回头处理。其实也就是几条命令的事升级完顺手一起装掉能省不少后续麻烦。顺便说下这些工具的安装目录它们会放进GOPATH/bin通常等于$HOME/go/bin或$HOME/workspace/go/bin。如果升级后终端提示找不到gopls先看看这个目录在不在 PATH 里。4.2 编辑器怎么感知到新版本VS Code 的 Go 插件、GoLand 这类 IDE在启动时会去探测 GOROOT 和 go 命令。升级完如果编辑器里版本没变一般是因为编辑器进程缓存了旧的探测结果。最简单粗暴的办法重启编辑器。VS Code 执行 Developer: Reload Window 即可GoLand 直接重启。如果重启后还不对检查编辑器的 Go 设置里GOROOT路径是否被手动指定过——GoLand 里如果有手动指定的 GOROOT它不会自动跟随系统升级。另外VS Code 的 Go 插件在升级后会提示你重新安装工具。这个提示别跳过插件内部会重新编译gopls等依赖确保和新版 Go 匹配。4.3 项目构建缓存与 go.mod 版本指令Go 从 1.20 左右开始构建缓存会自动按 Go 版本区分目录所以升级后旧缓存不会被新版本直接使用不会出现缓存污染导致的诡异报错。你的第一次构建会重新编译依赖速度慢一点是正常的不用手动清理缓存。但go.mod文件需要注意。假设你的项目go.mod里写的是go 1.20而你升级到了 1.24构建通常没问题因为 Go 保持向后兼容。反过来才麻烦如果项目里某个依赖的go.mod要求go 1.21而你的工具链还是 1.20构建时会直接报错go: module example.com/foov1.2.3 requires go 1.21这种情况下升级本机 Go 版本就是最直接的解决办法。这也是很多人升级 Go 的真正动机——不是追新而是项目依赖卡住了版本。5. 项目里偷偷用新版GOTOOLCHAIN 和多版本管理升级全局限一个版本说起来简单但真实项目里经常是这个项目要 1.21那个项目要 1.23CI 里又固定了一个版本。如果每次都手动切 PATH那效率比升级本身还低。Go 官方其实提供了一套很优雅的机制值得单独拿出来讲。5.1 Go 1.21 起的 GOTOOLCHAIN 机制从 Go 1.21 开始go命令支持GOTOOLCHAIN环境变量默认值是auto。它的逻辑是当你执行go build时如果当前的 Go 版本低于go.mod里声明的go指令版本Go 会自动下载对应版本的工具链来编译而不是直接报错。举个具体例子你本机装的是 Go 1.24某项目go.mod第一行写着go 1.22在这个项目里执行go build用的还是本机 1.24没问题。反过来如果本机是 1.22项目go.mod写着go 1.24go build会自动下载 Go 1.24 的工具链并切换过去不需要你动手。这意味着什么意味着你不用再为了一个项目专门安装指定版本官方已经帮你做好了按项目自动选版本。对个人开发机来说这甚至比手动维护多版本还方便。如果想强制某个项目禁用这个行为可以在环境变量或命令里指定GOTOOLCHAINlocal go build5.2 golang.org/dl 官方多版本工具如果你的工作流还是需要手动切换版本比如你要对比 1.22 和 1.24 的行为差异可以用官方提供的多版本下载工具。它不需要 root 权限也不需要动/usr/local/gogo install golang.org/dl/go1.22.5latest go1.22.5 download执行后go1.22.5这个命令就是独立的多版本 Go 入口用它跑什么都行go1.22.5 version go1.22.5 build ./...原理是它会把特定版本的 Go 下载到$GOPATH/pkg/mod/golang.org/toolchain...或$HOME/sdk目录下完全避开系统的/usr/local/go。需要几个版本就装几个切换成本几乎为零。这个方案尤其适合不想碰系统目录的情况比如公司服务器你没有 sudo 权限时。5.3 多版本共存的日常使用姿势结合前面两套机制我现在的日常操作基本是这样系统里只装一个比较新的 Go用于日常开发和go install工具遇到有特殊版本要求的项目直接在项目目录下执行靠GOTOOLCHAINauto自动切。真到了需要手动切换的场景再用golang.org/dl装的版本命令顶上。CI 那边则是另一套逻辑。团队项目我建议在.github/workflows或 GitLab CI 里显式固定 Go 版本不要依赖latest。比如- name: Set up Go uses: actions/setup-gov5 with: go-version: 1.24.x这样 CI 环境和本地大概率一致也能利用GOTOOLCHAIN让工具的下载逻辑保持一致。6. 升级过程中的真实报错与排查顺序最后这部分是实操里最容易踩到的坑。我按出现频率排序讲一下升级期间常见的报错以及处理顺序。6.1 go version 显示不出来 / 提示 command not found升级后终端里执行go version报command not found或者显示的还是旧版本。排查顺序应当是执行which go或where.exe go看命令实际指向哪个路径。如果指向的不是你刚替换的目录说明 PATH 顺序里有其他 Go 在占位。如果指向的是/usr/local/go/bin/go检查一下这个文件是否真的存在以及是否有执行权限。还有一个容易忽略的场景Linux 下你用sudo -i或别的用户执行命令时PATH 可能被重新定义不含/usr/local/go/bin。这不是升级的问题而是 sudo 环境的差异。解决方法是检查当前用户的 shell 配置文件比如.bashrc确认 PATH 里已经写入了 Go 的 bin 目录。6.2 升级后 go build 报 cgo/gcc 相关错误升级前项目编译正常升级后突然报类似这种错误exec: gcc: executable file not found in %PATH%这确实容易让人怀疑是升级导致的但绝大多数情况是新版本 Go 默认启用了某些以前没启用的特性或者你的构建参数里带了CGO_ENABLED1。如果你的项目确实需要 cgo解决办法不是回滚 Go 版本而是安装对应的 C 编译器——Linux 上装gccWindows 上装 MinGW-w64macOS 上装 Xcode Command Line Tools。如果是纯 Go 项目却莫名报 gcc 错误先检查环境变量CGO_ENABLED是不是被设成了1。很多人在全局 profile 里设过这个值自己都忘了。纯 Go 项目可以显式CGO_ENABLED0 go build来绕过。6.3 回滚方案与升级失败兜底最后说回滚。因为我一直在强调升级前要先备份所以回滚就是一条命令的事sudo rm -rf /usr/local/go sudo mv /usr/local/go.bak /usr/local/go go versionWindows 和 macOS 用户回滚就麻烦一点Windows 需要重新安装旧版 MSImacOS 如果之前用 brew 装的可以brew reinstall go旧版本或者从官网下载旧 tar 包替换。所以 Linux 环境下我总是建议保留备份目录一两天等确认所有项目构建正常后再删。我实际测试过的经验是升级后立刻要验证的不只是go version还应该跑一个真实项目的go build ./...和go vet ./...。因为版本号正确不代表编译行为正确只有项目能真正跑起来才算升级完成。升级 Go 版本这件事说穿了就是搞懂路径、替换目录、刷新工具、验证项目四步。我自己最常用的组合是Linux 上脚本替换/usr/local/go本机开发靠GOTOOLCHAINauto按项目自动适配版本特殊需求再拉golang.org/dl的独立版本命令。这套组合用了大半年基本没再为版本问题头疼过。你的环境如果和我不一样核心思路也能复用——记住先快照、再备份、后替换、勤验证版本升级就不会再是麻烦事。

相关新闻

ext4文件系统静态结构深度解析:从超级块到inode的磁盘布局实战

ext4文件系统静态结构深度解析:从超级块到inode的磁盘布局实战

1. 这不是教科书里的抽象概念,而是你每天读写文件时真正在打交道的底层骨架你双击打开一个文档,编辑几行字,按 CtrlS 保存——整个过程不到两秒。但在这两秒里,你的操作系统其实完成了一连串精密到毫秒级的协作:它要确…

2026/10/11 16:39:31 阅读更多 →
MySQL事务底层原理与隔离级别、锁机制及死锁排查实战

MySQL事务底层原理与隔离级别、锁机制及死锁排查实战

客户系统上线那周,我印象特别深。白天业务量不大,一切正常,结果晚上对账的时候发现订单表和库存表对不上了——有几笔订单扣了库存,但订单记录没写进去。代码逻辑是同一个方法里先扣库存再生成订单,怎么会出现只执行一…

2026/10/11 23:43:46 阅读更多 →
手写小型C编译器:从词法分析到代码生成的完整实现解析

手写小型C编译器:从词法分析到代码生成的完整实现解析

简介:一份小型C编译器完整实现源码,面向想深入钻研编译原理的学生与开发者。编译器将C语言翻译为可执行程序,需经历词法分析、语法分析、语义分析、优化与代码生成等阶段;这份代码完整覆盖这些核心流程,并配套头文件与…

2026/10/11 23:41:34 阅读更多 →

最新新闻

你的项目不是一次性的:vibe-vibe 迭代思维实战指南——从“做完“到“好用“

你的项目不是一次性的:vibe-vibe 迭代思维实战指南——从“做完“到“好用“

文档教程Vibe Coding示例工程 【免费下载链接】vibe-vibe The First Systematic Vibe Coding Open-Source Tutorial | From Zero to Full-Stack, Empowering Everyone to Build Products with AI | Live at: www.vibevibe.cn ;首个系统化 Vibe Coding 开源教程 | 零…

2026/10/12 5:47:24 阅读更多 →
Openblocks Drawer 抽屉组件实战:布局定位、尺寸控制与 openDrawer/closeDrawer 事件触发

Openblocks Drawer 抽屉组件实战:布局定位、尺寸控制与 openDrawer/closeDrawer 事件触发

低代码后端前端开发工具 【免费下载链接】openblocks 🔥 🔥 🔥 The Open Source Retool Alternative 项目地址: https://gitcode.com/gh_mirrors/op/openblocks 点击查看 免费下载 Drawer(抽屉)是 Openblo…

2026/10/12 5:47:24 阅读更多 →
Unsloth 3行代码微调:合成数据质量把控与实战指南

Unsloth 3行代码微调:合成数据质量把控与实战指南

直接正文开始。1. 为什么要用合成数据微调,以及为什么是Unsloth做微调这件事,最大的成本往往不是机器,而是数据。很多人一上来就到处找数据集,或者手工标注几百条样本,结果发现任务本身太垂直,公开数据根本…

2026/10/12 5:47:24 阅读更多 →
掉地面包背后:烘焙食安全链条拆解与门店现场管理落地

掉地面包背后:烘焙食安全链条拆解与门店现场管理落地

一家开了五年的连锁面包店,因为一段“员工把掉在地上的面包捡起来放回货架”的视频,一夜之间登上热搜,总部电话被打爆,门店营业额当周腰斩。这类事这几年并不少见,每次出现都会让整个烘焙行业跟着紧张一次。你可能会觉…

2026/10/12 5:47:24 阅读更多 →
C语言联合体与枚举:从内存利用到类型安全的实战指南

C语言联合体与枚举:从内存利用到类型安全的实战指南

写之前先说实话,这个标题我一开始真以为是个什么网红食谱,结果点进去才发现是个C语言的自定义类型话题。“嘎嘎滴辣虾”这个开场相当有迷惑性,但顺着这个味儿,今天这篇就想跟大伙儿聊聊联合体(union)和枚举…

2026/10/12 5:47:24 阅读更多 →
C++肉鸽游戏开发:随机地图生成与回合制AI实战解析

C++肉鸽游戏开发:随机地图生成与回合制AI实战解析

简介:由C与EasyX图形库实现的肉鸽游戏Slime-Hunter,是作者22级技科专业课程设计作品。游戏内含角色控制、敌人攻击动画与基础关卡机制,虽为中期版本,但核心玩法已具备完整雏形,适合正在学习C游戏开发的初学者参考。资源…

2026/10/12 5:46:23 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →