-
types.Union 描述接口中的联合类型项,不是运行时值容器。通过泛型与分析模型示例,区分非基本接口约束、具体类型调用和业务数据承载方式。
-
使用 Go go/types 分析泛型约束时,可以通过 Union.Len 与 Term 按索引导出联合项,也可以在支持 Go 1.24 的环境中用 Union.Terms 迭代。本文说明如何读取 Term.Type、Term.Tilde,以及空联合项、索引越界和版本兼容边界。
-
Go 中两个声明里的 T 即使名称和约束都相同,也属于不同的类型参数对象。本文用 go/types.TypeParam、Obj、Constraint、Index 和 Identical 对比常见判断方式,说明源码分析时为什么必须保留声明作用域。
-
Go types.TypeParam.Underlying 返回接口而不是 int 等具体类型,是因为类型参数的底层类型取自约束,而约束的底层类型总是接口。本文区分 TypeParam、Constraint、Underlying、类型集合与 TypeArgs,说明静态分析时怎样读取真正需要的信息。
-
go/types 的 TypeParam 允许先创建、后设置约束,但 SetConstraint 不能随意插入类型查询流程。本文用两阶段组装示例说明约束完整性、Underlying 读取、Named 绑定和并发使用的边界。
-
用 go/types 分析泛型签名时,TypeParam.Index 可以提供参数在参数列表中的零基位置。本文说明如何直接读取 TypeParamList,以及如何处理类型检查结果中的无序参数和未绑定参数。
-
从 TypeParam.Obj 取得声明对象,再用原 FileSet 将 Pos 转成文件名与行列。示例说明泛型参数定位、NoPos、行指令以及源码导航服务中的位置边界。
-
使用 go/types.NewTypeParam 创建类型参数时,可以先传入 nil,再在约束接口完全定义后调用 SetConstraint。本文按初始化顺序说明 NewTypeName、NewInterfaceType、Complete、Constraint、Underlying 与 Named.SetTypeParams 的关系。
-
用 go/types.Named.TypeArgs 可以读取泛型命名类型实例化时绑定的类型实参。本文从一个 Box[int] 的类型检查结果出发,说明如何导出 TypeArgs,并区分 Origin、TypeParams 与 Underlying 的职责。
-
在 go/types 中,两个 Named 类型可以拥有相同的底层类型,但它们的声明身份、方法集和类型参数仍然不同。本文用 UserID 与 OrderID 的例子拆开 Identical、Underlying、Obj、Methods 和泛型信息的区别,帮助静态分析工具选对判断入口。
-
讲清 Go types.Info.FileVersions 的 map 键值、文件版本与 Config.GoVersion 回退关系,并给出按原始 *ast.File 指针稳定读取的原创示例。
-
Go types.Struct.Tag 返回的是字段标签字符串,空字符串既可能来自未设置标签,也可能来自空原始标签。本文对比 AST 的 Field.Tag、go/types.Struct.Tag 和 reflect.StructTag.Lookup,说明三种层次分别能保留什么信息。
-
用 go/types.Struct 描述结构体字段,再通过 SizesFor、Offsetsof、Alignof 和 Sizeof 生成布局报告。本文重点说明编译器架构、padding、数组对齐以及类型分析与运行时地址的区别。
-
用 go/types.NewField 和 NewStruct 可以按字段顺序构造结构体类型;嵌入字段通过 embedded=true 表达,标签切片则按字段下标对应。本文给出带命名类型嵌入字段的完整示例,并说明读取字段、标签和后续类型检查的边界。
-
不同包的同名未导出字段具有不同名称身份。通过 go/types 对照例子,说明 Name、Id、Identical 的职责,以及包路径、字段标签和符号集合一致性。