-
Go types.Interface 用两组 API 分别枚举显式方法与完整方法集。本文通过嵌入接口示例说明数量上界、底层类型、排序和类型约束的区别,适合文档生成与静态分析工具。
-
go/types 的 Info.Selections 只记录值上的字段和方法选择,包限定名应从 Info.Uses 中读取。本文用 AST 和类型检查示例说明两类 SelectorExpr 的区别。
-
go/types.Selection 同时描述选择到的声明对象和选择表达式的结果类型。本文从 Info.Selections 出发,解释 Obj、Recv、Type 的职责差异,并用 FieldVal、MethodVal、MethodExpr 说明方法接收者为何让 Obj.Type 与 Selection.Type 不总是相同。
-
用一个最小 Go 源码分析器读取 types.Info.Selections,解释 Selection.Kind 返回 FieldVal、MethodVal 和 MethodExpr 的差异,重点区分 p.Run 方法值与 Worker.Run 方法表达式,并输出接收者、函数类型和嵌入路径。
-
Go 类型分析工具拿到 *types.Selection 后,可以用 types.SelectionString 统一生成字段或方法选择字符串,并通过 Qualifier 控制接收者类型中的包名显示。本文给出从 types.Info.Selections 取值、编写包名限定函数和处理嵌入字段的完整写法。
-
区分 Go Selection.Indirect 的选择路径含义和方法声明接收者,以嵌入指针字段说明误判,并给出读取原始方法签名的辅助函数及历史行为注意事项。
-
Go 嵌入类型出现同名方法时,提升方法会因选择器歧义而不进入 go/types.MethodSet。本文用最小示例说明嵌入深度、显式调用和静态分析中的修复边界。
-
go/types.NewMethodSet 会为类型构造方法集合,而 Len、At、Lookup 都是读取接口。本文用分析会话内的类型身份建立缓存,说明如何只构造一次并安全复用只读 MethodSet,同时处理并发 miss、指针类型和缓存生命周期。
-
Go types.MethodSet 只返回方法,不负责列出结构体字段。本文区分 MethodSet、types.Struct 和选择器查找,并说明嵌入字段的方法提升与同名冲突边界。
-
types.MethodSet.Lookup 按包身份和方法名查找方法,未导出方法的包路径会参与唯一标识。本文用类型检查结果构造方法集合,演示怎样命中 refresh、读取 Selection.Obj,并解释包不匹配时为什么返回 nil。
-
Go 静态分析中,types.NewMethodSet 对 T 和 *T 返回不同数量并不代表 API 丢失方法,而是值接收者、指针接收者与方法集规则共同作用的结果。本文用排障手册方式拆开判断边界。
-
用 go/types.NewMethodSet 遍历 Go 类型的方法集合,结合 Selection 的 Obj、Recv、Index 和 Indirect 字段识别嵌入类型提升的方法,并比较 T 与 *T 的方法边界。
-
go/types 的 Scope.Insert 不会覆盖同一作用域里已有的同名对象。本文用最小示例说明 nil 与旧对象返回值的区别,并梳理 Lookup、Names、Parent 以及子作用域遮蔽的边界。
-
Go types.Scope.Contains 接收的是 token.Pos,不是源码行号。本文从源码分析工具的实际排查场景出发,说明为什么行号比较会误判,以及如何用 FileSet、半开区间和完整位置安全判断作用域。
-
Go 源码位置查询需要先定位最内层作用域,再沿父链查找可见声明。通过同名变量示例说明 LookupParent、位置参数与 Info.Uses 的分工和接入边界。