Go语言技术文章
-
Go ImportSpec.Path.Value 保存带引号的源码字面量,应使用 strconv.Unquote 还原路径。本文给出双引号和反引号导入示例,说明错误处理、别名分离与展示格式的边界。153 收藏 -
用 Go AST 读取 ast.File.Imports,解析每条 ImportSpec 的导入路径、显式别名、点导入和下划线导入,并用 FileSet 还原源码位置。319 收藏 -
分析 Go 泛型 AST 时,[A, B comparable] 只有一个 Field,但 Names 中包含两个类型参数名。本文从 TypeSpec.TypeParams 出发,给出共享约束的展开方式,并区分声明参数与 IndexListExpr 的类型实参。479 收藏 -
Go IndexListExpr 只能表示带多个索引表达式的语法节点,不能单独证明目标是泛型实体、类型实参满足约束或实例化结果可调用。本文用 go/ast 与 go/types 说明两层职责和实用检查流程。416 收藏 -
围绕 go/parser 与 go/ast 说明如何从 TypeSpec.TypeParams 提取泛型类型参数,正确处理 Field.Names 的多名称共享约束,并区分类型声明与泛型实例化。370 收藏 -
Go AST 可通过 FuncType.TypeParams 提取泛型函数的类型参数。本文给出名称展开、约束格式化和注释转义的完整示例,说明自动生成文档时的失败处理与语义边界。217 收藏 -
Go 的 G[int] 只有一个方括号表达式,解析器会把它表示为 ast.IndexExpr;只有逗号分隔的多个参数才使用 IndexListExpr。本文说明两类节点的字段差异,以及如何用 go/types.Info.Instances 补充泛型语义。269 收藏 -
Go 解析结构体时,嵌入字段的 ast.Field.Names 为什么看起来为空?本文从排查现场拆开说明 Names=nil 的 API 语义、Field.Type 的类型表达式和 FieldList.NumFields 的计数规则,帮助静态分析器正确处理 T、*T、P.T 等嵌入字段。304 收藏 -
Go ast.IndexListExpr 的 X 保存基表达式,Indices 保存多个显式类型实参。本文给出遍历示例,区分普通调用实参、单实参 IndexExpr 与类型推断,并说明语法分析的边界。359 收藏 -
Go AST 文档工具解析函数结果时,不能直接把 FieldList.List 的下标当作返回值位置。本文用 NumFields 和 Field.Names 区分语法节点与语义槽位,为无名返回值生成稳定编号,并保留类型和源码行号。254 收藏 -
Go 空 FieldList 与 nil 都可以安全得到 0,但 len(List) 不等于实际参数或字段数量。本文拆开 nil 接收者、空列表、匿名字段和同一 Field 多个名字的计数语义,并给出 AST 遍历中的统一写法。352 收藏 -
Go AST 中 FieldList.List 统计的是 Field 节点分组,不一定等于参数个数。本文用源码示例说明 Field.Names、NumFields 与可变参数的边界。308 收藏 -
Go AST 中一个 Field 可以保存多个参数名。本文比较分组计数、NumFields 与参数明细方案,用完整示例展开 Names,并处理无名参数、空白标识符和可变参数。327 收藏 -
Go 的 ast.CommentMap.Filter 会新建一个映射容器,但不会深复制 AST 节点、注释组或注释列表。本文拆开说明这些引用的复用边界,并解释 AST 替换时何时使用 Update、何时需要显式复制。173 收藏 -
Go AST 改写后要恢复文件注释列表,应在解析时用 ParseComments 创建 CommentMap,替换节点时调用 Update,改写完成后用 Filter 清理已删除节点,最后用 Comments 按源码顺序取得有效注释组。176 收藏