程序员茄子
全部
编程
代码
资讯
案例
综合
联系我们
go 相关技术文章(第2页)
php
mysql
shell
go
vue
css
api接口对接
支付接口对接
Go 1.28 的 Timer 复制检测:Stop() 返回 false 之后,定时器为什么还在跑
编程
Go 1.28 的 Timer 复制检测:Stop() 返回 false 之后,定时器为什么还在跑
2026-11-08 21:02:30
Go 1.28 用自指针取代 Timer 内部的 init bool,按值复制的 Timer/Ticker 会被检测出来。这篇讲清楚副本 Stop() 返回 false、Reset 后堆里出现两份、channel 多一次 tick 的完整路径,为什么 copylocks、race detector、pprof 都查不到,以及怎么改成持有指针。
Go
定时器
并发
Go 1.27 的泛型方法:能链式调用,但进不了接口,接口也声明不出来
编程
Go 1.27 的泛型方法:能链式调用,但进不了接口,接口也声明不出来
2026-11-08 20:03:07
Go 1.27 允许具体方法自带类型参数,Map 这类操作能挂在类型上并链式调用;但接口仍不能声明泛型方法,泛型方法也无法满足接口,函数类型推断同时铺开到复合字面量、类型转换与 channel 发送。
Go
泛型
语言特性
Go 的 x509 报错是 verify.go 里写死的分支:按文案反推证书校验根因
编程
Go 的 x509 报错是 verify.go 里写死的分支:按文案反推证书校验根因
2026-11-08 00:04:32
Go 的 crypto/x509 报错文案来自 verify.go 的固定分支:没有 IP SAN、CN 兜底、名字列表超 100 条、候选签发者被拒、信任库为空,各自对应不同根因。附源码对照、Go 1.15/1.17/1.18 版本边界与 openssl 排查命令。
x509
TLS
证书
Go
运维
排错
staticcheck 2026.2 的 SA9010:defer f() 丢掉了那个该在退出时跑的闭包
编程
staticcheck 2026.2 的 SA9010:defer f() 丢掉了那个该在退出时跑的闭包
2026-11-08 00:04:30
SA9010 是 staticcheck 2026.2 新增检查,只做一句类型判断:defer 的调用结果如果是函数值就报。本文给出最小复现、defer 两阶段求值差别、带参数返回函数的修复写法,以及旧版本 -checks=SA9010 静默不检查的原因。
SA9010
staticcheck
Go
lint
defer
pg_advisory_unlock 返回 false:Go 连接池下 session 级咨询锁的失效路径
编程
pg_advisory_unlock 返回 false:Go 连接池下 session 级咨询锁的失效路径
2026-11-08 00:04:05
Go 服务里 pg_advisory_lock 拿锁正常、pg_advisory_unlock 却返回 false 并打 WARNING:根因是 database/sql 连接池不保证两条语句走同一条 backend。给出 db.Conn 独占连接、改事务级 pg_advisory_xact_lock 两种写法,附 pg_locks 键编码还原、等待行定位、lock_timeout 与锁表容量边界。
咨询锁
PostgreSQL
Go
连接池
锁排查
钉钉机器人 webhook 接入:加签在 URL query,Outgoing 在 HTTP header,310000 怎么查
编程
钉钉机器人 webhook 接入:加签在 URL query,Outgoing 在 HTTP header,310000 怎么查
2026-11-07 21:33:16
钉钉群机器人发告警时,主动发送的 timestamp/sign 拼在 URL query,Outgoing 接收消息的签名却在 HTTP header,写反了只会拿到 310000。这篇记录了加签三步(毫秒时间戳、HMAC key 是 secret、Base64 后必须 urlEncode)、20 条/分钟限流的合并做法、310000 四种 errmsg 的排查顺序,以及三种安全设置怎么选。
钉钉
webhook
接口对接
告警
Go
Go 1.28 把 string(整数) 改成编译错误:string(65) 不再等于 "A"
编程
Go 1.28 把 string(整数) 改成编译错误:string(65) 不再等于 "A"
2026-11-07 21:03:52
Go 1.28 收紧 string(x) 规则(#3939):x 是整数时只有 byte / rune 类型或无类型 rune 常量才允许,string(uid)、string(resp.StatusCode) 这类写法直接编译不过。给出 strconv 替换、允许保留的写法,以及先用 go vet 的 stringintconv 批量定位的迁移顺序。
Go
编译
类型转换
编译错误
同一个 DELETE,changes() 返回 1,total_changes 涨了 3
编程
同一个 DELETE,changes() 返回 1,total_changes 涨了 3
2026-11-07 00:05:59
RowsAffected 到底数了什么:SQLite 的 sqlite3_changes 只算语句直接改的行,total_changes 连触发器程序和外键级联一起算,却不含 REPLACE 消解。给出五个可复现探针,以及触发器内读 changes() 的保存/恢复陷阱、INSTEAD OF 视图恒为 0、expo-sqlite 与 bun 的真实踩坑,最后说明判「命中」与判「真变」为什么必须分开。
RowsAffected
SQLite
影响行数
触发器
外键级联
Go
数据库
Uncloud v0.22 部署笔记:没有控制面,用 WireGuard mesh 和 CRDT SQLite 管 Docker 集群
编程
Uncloud v0.22 部署笔记:没有控制面,用 WireGuard mesh 和 CRDT SQLite 管 Docker 集群
2026-11-06 21:32:10
Uncloud 用 WireGuard mesh 加 CRDT SQLite(corrosion)在多台 Docker 主机间同步集群状态,没有控制面和 quorum。笔记给出 uc machine init / uc run -p 域名:端口/https 的可复现步骤,讲清 gRPC over SSH、Caddy global 模式做 ingress、unregistry 直推镜像,并记录 v0.22.0 的原地改资源限制、uc image rm、m.internal DNS,以及 caddy deploy 会重签证书与机器名必须是 DNS label 两个升级坑。
docker
部署
运维
Go
Go 1.28 的 Range 请求超过 200 段就整段忽略:断点续传与分片下载会退回整包
编程
Go 1.28 的 Range 请求超过 200 段就整段忽略:断点续传与分片下载会退回整包
2026-11-06 21:02:02
Go 1.28 对 FileServer/ServeContent 等入口限制 Range 头段数,超过 httpservecontentmaxranges(默认 200)就整段忽略,返回 200 全量而不是 206,断点续传和分片下载会静默失效。该默认值已回溯到 1.27.2 与 1.26.9。含 curl 构造 201 段的验证方法与关闭限制的取舍。
Go
HTTP
文件下载
GODEBUG
Go 1.28 加了 netmarshal,默认还是 0:JSON 里的 IPMask 与 IPNet 仍是一串 base64
编程
Go 1.28 加了 netmarshal,默认还是 0:JSON 里的 IPMask 与 IPNet 仍是一串 base64
2026-11-06 21:01:54
Go 1.28 新增 netmarshal,控制 net.IPMask、net.IPNet、net.HardwareAddr 的 JSON 是读数 base64 还是可读文本。1.28/1.29 默认仍为 0,预计 1.30 才翻转。文中给出两种编码对照、go.mod 的 godebug 固定方式、灰度期混合版本会怎么炸,以及哪些场景才值得打开。
Go
GODEBUG
序列化
JSON
crypto/tls 的 Read/Write 每次都白付一次 deferreturn:2 万连接 profile 里占 2.7% CPU
编程
crypto/tls 的 Read/Write 每次都白付一次 deferreturn:2 万连接 profile 里占 2.7% CPU
2026-11-06 20:03:33
Go 标准库 crypto/tls 的 handshakeContext 有四处未开放编码的 defer,握手完成后的原子早返回也要走 runtime.deferreturn。2 万条长连接广播的 profile 里这部分占整机 2.7% CPU,同形状基准 7.2ns/op 对 2.1ns/op。给出 -d=defer 的验证方法与拆分写法。
Go
TLS
性能优化
Go IM 消息存储拆解:100 条一桶的 Mongo 分桶、幂等写入与三个线上 bug
案例
Go IM 消息存储拆解:100 条一桶的 Mongo 分桶、幂等写入与三个线上 bug
2026-11-06 20:02:57
拆解 OpenIM 系 IM-Server 的消息存储:为什么聊天记录不用 MySQL、一条消息一文档死在哪、100 条一桶的 Bucket Pattern 如何用 (seq-1)/100 定位,Kafka 重复消费下的幂等写入状态机,读时改写让一条群消息只存一份,以及 del_list 无界增长、IsFull 空数组 panic、桶大小写死寻址无法迁移这些真实问题。
Go
MongoDB
存储设计
IM
服务端提前返回 502 后,Go 的 writeLoop 还在读你的 buffer
编程
服务端提前返回 502 后,Go 的 writeLoop 还在读你的 buffer
2026-11-06 20:01:53
复现并解释 Go 的一个数据竞争:服务端只看请求头就提前回 502 时,http.Transport 的 writeLoop 仍在后台按 32KiB 读请求体,而调用方已经开始重试、复用同一块 buffer。拆开 persistConn 的 writeLoop/readLoop 与 roundTrip 的 select,说明文档约定、真实后果,以及 vmagent 为何故意保留这个竞争、vmauth 为何必须修。
Go
并发
HTTP
数据竞争
接口签名总对不上:%20 变 +、漏编码 !'()*、键序被 locale 改过
代码
接口签名总对不上:%20 变 +、漏编码 !'()*、键序被 locale 改过
2026-11-06 09:02:20
前端签名能过、后端复算不一致,问题多半在待签名串而不在算法。这篇按踩坑频率列出八处字节级差异:空格编成 %20 还是 +、encodeURIComponent 保留的 !'()*、quote 的 safe 默认值、排序受 locale 影响、空值与 undefined 的剔除规则、数组编码,以及 body 被重新序列化后验签必挂。附两端签名原文对比的四步排查法。
接口对接
签名
URL编码
PHP
Go
SA5011 说这里会 nil 解引用:证据其实是你自己写的那句 if x == nil
编程
SA5011 说这里会 nil 解引用:证据其实是你自己写的那句 if x == nil
2026-11-06 00:04:18
staticcheck 的 SA5011 不是「这里一定 nil」,而是把你自己写过的 nil 比较当作证据。本文拆它的判定组合,讲清三类误报(多余的第二次检查、测试里 t.Fatal 之后、自定义 Fatalf 不被识别为终止函数)、golangci-lint facts 缓存导致的抖动,以及 2026.2 停用 SA5011 后 gopls nilness 的替代与取舍。
SA5011
staticcheck
Go
lint
nilness
Go 批处理 UPDATE 开了 clientFoundRows=true:判空从静默漏数据变成无限空转
编程
Go 批处理 UPDATE 开了 clientFoundRows=true:判空从静默漏数据变成无限空转
2026-11-06 00:04:12
Go 脚本用 UPDATE ... LIMIT 分批处理时,如果连接串开了 clientFoundRows=true,RowsAffected 返回的是匹配行数而不是改动行数,同一批行会被反复处理:轻则无限空转,重则默认语义下 changed=0 提前 break、静默漏掉后面几百万行。给出一个探针 SQL 判断当前连接池的语义,以及用主键游标改写批处理的完整代码。
clientFoundRows
MySQL
Go
go-sql-driver
RowAffected
批处理
RowsAffected
SA4023 报的总是 nil 比较:typed nil 装进 interface 后为什么不等于 nil
编程
SA4023 报的总是 nil 比较:typed nil 装进 interface 后为什么不等于 nil
2026-11-06 00:03:56
SA4023 报的是 interface 与 untyped nil 的无效比较:*T(nil) 装箱后接口非 nil,err != nil 恒真。文中给出最小复现、判定两条件、evcc 与泛型包装器的修法,以及 2026.2 重写后的版本核对顺序。
SA4023
staticcheck
Go
lint
代码质量
Nil
Go 1.27 的 encoding/json/v2:默认拒重复键和非法 UTF-8,v1 代码已换实现
编程
Go 1.27 的 encoding/json/v2:默认拒重复键和非法 UTF-8,v1 代码已换实现
2026-11-05 21:06:05
Go 1.27 把 encoding/json 换成 v2 实现,错误文本可能变化;新包 json/v2 默认拒绝非法 UTF-8 和重复成员名,inline 标签改名 embed。本文列出 v2 的 API 形态、三条迁移路径与 GOEXPERIMENT=nojsonv2 回退的边界。
Go
JSON
标准库
迁移
后端
goose 迁移:开发用时间戳、上线前 fix 转顺序号,Down 段没写就没有回滚
综合
goose 迁移:开发用时间戳、上线前 fix 转顺序号,Down 段没写就没有回滚
2026-11-04 21:31:48
pressly/goose 的落地笔记:SQL 迁移文件注解、MySQL 必开的 parseTime 与 multiStatements、开发用时间戳上线前 fix 转顺序号、embed 内嵌进二进制,以及 Down 段没写就没有回滚这个前提。
goose
数据库迁移
Go
SQL
复制一个 time.Timer 会让整个 Go 程序卡死,panic 只给一句 ts set in timer
编程
复制一个 time.Timer 会让整个 Go 程序卡死,panic 只给一句 ts set in timer
2026-11-04 21:09:36
Go 1.22 里能跑的 *time.NewTimer(d) 赋值,到 1.23 起会让整个程序冻结或抛 ts set in timer,SIGQUIT 的栈里还看不出根因。讲清无缓冲 channel 与可回收改动为何让复制 Timer 必炸、vet copylock 与运行期动态检查的进展,以及指针写法的修法。
Go
定时器
并发
排障
RoadRunner v3:http.middleware 改成从左到右执行,Kafka 重试也不再回写原 topic
编程
RoadRunner v3:http.middleware 改成从左到右执行,Kafka 重试也不再回写原 topic
2026-11-04 21:06:53
RoadRunner v3 升级里几处不报错但改行为的地方:http.middleware 从左到右执行(v5 列表要反转)、Goridge v4 去掉 MessagePack、H2C 只认 prior knowledge、Kafka 重试进进程内队列重启会丢、max_workers 变成"基础池之上的增量"。
RoadRunner
PHP
Go
队列
gopls v0.24.0 的交互式重构:服务端在算 edits 之前先向你提问
编程
gopls v0.24.0 的交互式重构:服务端在算 edits 之前先向你提问
2026-11-04 20:03:26
LSP 的 code action 一直是「无参函数」,服务端只能猜意图。gopls v0.24.0 用与 Dart 团队合作提的 interactive refactoring 提案(LSP #1164),让服务端在算 edits 之前先弹表单收集输入:struct tag 加哪些键、用什么命名风格、实现哪个接口、声明移到哪个文件。附各动作版本、maphash.Hasher 示例、panic("unimplemented") 桩与 import cycle 风险。
Go
gopls
LSP
重构
编辑器
Go 1.24 默认用 MPTCP 监听:Linux 内核 CVE-2026-98432 的排查与缓解
资讯
Go 1.24 默认用 MPTCP 监听:Linux 内核 CVE-2026-98432 的排查与缓解
2026-11-03 21:04:12
Linux 内核 CVE-2026-98432(IPv4 TCP options RCU UAF,CVSS 9.8)的利用前提是暴露 MPTCP 监听,而 Go 1.24 起把 multipathtcp 默认值改成 2,Go 服务在 Linux 上默认就是 MPTCP 监听。给出 ss -Mltnp / go version -m 排查、GODEBUG 与 sysctl 缓解,以及为什么关 MPTCP 不算修复。
Go
Linux
安全
大家都在搜索什么?
devops
易支付
一个官网+多少钱
统一接受回调
统一回调
python
sub
node
宝塔日志
mysql
shell
ElasticSearch
css
vue
api接口对接
2025
支付接口对接
go
php
php回调
上一页
1
2
3
4
5
6
7
…
25
下一页
共 25 页
到第
页
确定