变量显示需在构建参数中添加-gcflags="-n -l"并clean+rebuild;结构体字段可悬停或右键force evaluate;全局变量需在evaluate expression中输入全名访问。

变量显示为 <optimized out></optimized> 怎么办
这是最常遇到的卡点:断点停住后,Variables 面板里变量名后面直接写着 <optimized out></optimized>,点不开、悬停也看不到值。
根本原因是 Go 编译器默认开启优化(-gcflags="-l -N" 被覆盖),调试信息被剥离。不是配置问题,也不是 IDE 故障。
- 必须重新构建:在 Run Configuration →
Go Build→Build flags里填入-gcflags="-N -l" - 注意顺序:
-N(禁用内联)和-l(禁用函数内联与行号优化)缺一不可;-l单独加没用 - 改完后要 Clean + Rebuild,不能只 Run 或 Debug —— 否则仍用旧二进制
结构体字段展开后显示 <not computed></not>
鼠标点开结构体变量,子字段全是 <not computed></not>,不是 bug,是 GoLand 的懒加载策略:只在真正需要时才向 Delve 请求完整数据,避免拖慢调试器。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 把鼠标悬停在那个字段上,等 1–2 秒,值通常会自动浮现
- 右键该字段 →
Force evaluate,强制立即计算(适合嵌套深或接口类型) - 如果字段是接口类型(如
io.Reader),需手动做类型断言才能看到底层值,例如输入var.(os.File)在Evaluate Expression中
全局变量和包级变量看不到
Variables 面板默认只显示当前作用域(函数内)的变量,包级变量、全局变量不会自动列出,但它们可查、可求值。
- 直接在
Evaluate Expression(Alt+F8)中输入变量全名,例如main.myConfig或http.DefaultClient - 若变量未导出(小写开头),仍可访问,但需带包路径,如
myPkg.unexportedVar - 无法通过悬停查看——因为悬停只作用于编辑器当前文件中“可见”的标识符
Evaluate Expression 支持哪些操作
它不是 REPL,而是基于当前 goroutine 栈帧的实时表达式求值器,能做的事比想象中多,但有边界。
- 支持字段访问:
user.Profile.Name、users[0].ID - 支持 map 查 key:
cache["key"],若 key 不存在会 panic,慎用 - 支持简单函数调用:
strings.TrimSpace(s)、len(data),但不能调用含副作用的函数(如log.Print()) - 不支持定义新变量或使用控制流(
if/for) - 结果类型必须能被 Delve 序列化,闭包、chan、func 类型会显示
<unsupported></unsupported>
真正容易被忽略的是作用域限制:它只认当前断点所在 goroutine 的栈上变量,跨 goroutine 或已退出函数的局部变量不可见。别指望它查另一个协程里的 ctx 值。










