goast-viewer是专为Go语言设计的Web版AST可视化工具,支持拖放或URL输入代码、解析生成可交互树形图,具备折叠/展开功能,适用于教学、审查、重构等场景。

直接用 ast.Print 只能输出调试用的树状文本,不能生成可读、可交互的可视化界面;真要“可视化”,得靠 goast-viewer 这类 Web 工具或自己搭前端渲染逻辑。
用 ast.Print 快速看结构,但别当正式输出用
ast.Print 是标准库里最轻量的 AST 查看方式,适合本地调试时快速确认节点是否解析成功。它把 *ast.File 按缩进格式打印到 io.Writer(比如 os.Stdout),输出是纯文本、无样式、不可折叠。
- 它不保留注释位置,
parser.ParseComments开了也没用 ——ast.Print本身不渲染注释 - 函数体为空(
FuncDecl.Body == nil)时,它只显示签名,不报错也不提示,容易误判为“没解析到” - 输出里所有标识符都带
Pos和End偏移,人类难读,更适合机器扫日志 - 示例调用:
ast.Print(fset, file),其中fset必须和parser.ParseFile用的是同一个*token.FileSet
想真正“可视化”?用 goast-viewer 启个本地服务
goast-viewer 是目前最成熟、零配置的 Go AST 可视化方案,本质是把 go/ast 解析结果喂给前端 goast.js 渲染成可点击展开的树。
- 必须用
parser.ParseFullFiles模式启动解析,否则函数体、分支语句等节点在树里直接消失 - 粘贴代码后点
Parse,右侧树形图默认展开顶层节点(*ast.File),但子节点全折叠 —— 别以为失败,是设计如此 - 支持
Collapse all/Expand all,也支持单击任意节点手动展开,适合逐层定位*ast.CallExpr或*ast.BlockStmt - 不依赖 Go 环境运行:构建完是静态 HTML + JS,浏览器打开
index.html就行,连go命令都不需要
自己写可视化?绕不开 go/ast + json 序列化这步
如果要集成进 CLI 工具或 IDE 插件,常见做法是把 AST 节点转成 JSON 再交给前端渲染。但 go/ast 节点不支持直接 json.Marshal,因为含指针、未导出字段、循环引用。
立即学习“go语言免费学习笔记(深入)”;
- 必须手写递归遍历器(用
ast.Inspect),对每个节点提取关键字段:如Ident.Name、FuncDecl.Name.Name、Field.Type的字符串表示 -
ast.Ellipsis、ast.StarExpr这类类型节点不能直接.String(),得做类型断言再拼接 - 位置信息(
Pos/End)要通过fset.Position(pos)转成行号列号,否则 JSON 里只有整数偏移,前端没法高亮 - 别用
fmt.Sprintf("%+v")或spew.Sdump输出 —— 它们会把内存地址、未导出字段全打出来,JSON 体积暴增且不可控
为什么你看到的 AST 可视化工具都不显示注释内容?
不是工具偷懒,是 Go 标准库的设计限制:go/ast 节点本身不存注释文本,注释挂在 *token.FileSet 里,靠 ast.CommentGroup 关联位置。可视化工具要显示注释,必须额外做三件事:
- 解析时传
parser.ParseComments,否则file.Comments是空切片 - 遍历所有
ast.Node时,用fset.File(node.Pos()).Position(node.Pos())找到该节点所在行 - 再去
file.Comments里查有没有落在同一行或前一行的*ast.CommentGroup,再提取List[0].Text - 多数轻量工具(包括早期
goast-viewer)跳过了这步 —— 因为真实项目里注释位置和代码块的对应关系非常松散
真正卡住人的从来不是“怎么画一棵树”,而是“怎么让树里的每个节点都指向源码真实位置、带上下文、能反查”。一旦开始处理 import 路径解析、跨文件引用、类型别名展开,可视化就不再是前端事了 —— 它立刻变成 go/types 和 golang.org/x/tools/go/loader 的活。



















