当 nil 不等于 nil?深度剖析 Go 的 typed nil 大坑

0. 一个能“悄悄坑你”的真实示例:SError 的故事 先看你提到的这段代码,表面上看非常正常,甚至很多人第一眼不会觉得哪里有问题: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package main import ( "log" "sync" ) type SError struct { cause error // Wrapped error which is the root cause. text string // Error text, which is created by New* functions. i18nText string // 本地错误文字,用于客户端显式中文 ignored bool // 能否忽略该错误 info map[string]string infoMutex sync.RWMutex } func (e *SError) Error() string { return e.text } // demoRetSerr 返回 (int32, *SError)。看上去,如果不想返回任何错误,就直接返回 (0, nil) func demoRetSerr() (int32, *SError) { return 0, nil } func main() { var err error // 这里把第二个返回值的 *SError 赋给了 interface{} 类型的 err _, err = demoRetSerr() if err != nil { log.Printf("err != nil. err: %v", err) } } 0.1 乍看之下哪里会有问题? 我们 demoRetSerr 函数直接返回 (0, nil),而函数签名的第二个参数类型是 *SError。 回到 main 函数中,err 是一个 error 接口,承接了那个 nil 指针。 如果“typed nil” 现象出现,那么 err != nil 这个判断就会莫名其妙地通过,从而在日志里打印出“err != nil. err: <nil>”。有时更可怕的是,实际逻辑会被误判,可能执行本不该执行的错误处理分支。 在某些 Go 版本或特定编译器优化下,你可能发现控制台就输出 err != nil. err: <nil>,让人“一头雾水”。这就是一个十分典型、却很隐蔽的 typed nil 场景。即使你写 return nil,对编译器来说: ...

五月 15, 2025 · 6 分钟 · 4169 字 · [厉辉(Yousa)](https://github.com/Miss-you)

畅享 ChatGPT Plus:无需额外支付手段,突破 OpenAI 支付风控

截至 2024 年 2 月 10 日,该教程仍然有效。我已根据此教程重新操作并成功充值。请注意,购买苹果充值卡时应确保从苹果官方网站购买。 ChatGPT Plus 的优势 GPT-4 的性能非常强大,这是众所周知的事实。 Plus 会员可以使用 ChatGPT 的在线和插件功能,这些功能将极大地增强你的创造力,并为你的个人学习和工作效率提供强大的支持工具。 ...

四月 23, 2024 · 6 分钟 · 6231 字 · [厉辉(Yousa)](https://github.com/Miss-you)

【译】创业生存手册:如何有效地打造产品、组建团队并筹集资金

作者:Sam Altman 原文:https://playbook.samaltman.com/ Sam Altman,OpenAI CEO,经常会在博客中分享他的创业经验与智慧。Sam 曾分享过一篇他的经典文章《创业生存手册:如何有效地打造产品、组建团队并筹集资金》,他提供了一系列富有洞见的指导,帮助我们理解创业的艰难和挑战,并找到成功的途径。无论你是创业新手,还是经验丰富的科技专家,都能在这篇文章中找到有价值的收获。#SamAltman #创业 #科技 ...

七月 3, 2023 · 32 分钟 · 16036 字 · [厉辉(Yousa)](https://github.com/Miss-you)

提升专注力的七种方法

第一,把手机放在看不见的地方:手机已成为现代生活中最大的分心来源。为确保专注力,可以关闭工作用即时通讯软件、退出群聊、取关公众号、卸载容易分心的 APP。通过将手机放在看不见的地方或设置勿扰模式,有助于减少干扰。 ...

四月 21, 2023 · 2 分钟 · 1261 字 · [厉辉(Yousa)](https://github.com/Miss-you)