Go语言技术文章
-
Go 结构体末尾放置 struct{} 或 [0]byte 时,字段本身仍可能是零大小,但非空结构体会为布局安全保留额外字节。本文比较 go/types.Sizes、unsafe.Sizeof 与字段偏移的适用边界。478 收藏 -
Go Info.InitOrder 可在类型检查后列出包级变量初始化器。本文给出读取 Lhs、Rhs 和源码位置的示例,解释依赖排序、多返回值以及零值变量和 init 函数的范围。112 收藏 -
Go 交叉编译时,go/types 的类型尺寸应跟随目标 GOARCH,而不是直接复用分析程序所在宿主机的字长。本文解释 SizesFor、StdSizes、WordSize 和 MaxAlign 的关系,并给出可落地的选择方式。303 收藏 -
go/types.Sizes.Sizeof 返回负值时,表示类型太大而不是合法的负尺寸。本文结合 StdSizes 的数组与结构体实现,说明如何区分未知架构、零大小、正常尺寸和溢出哨兵,并在静态分析中安全传播结果。501 收藏 -
Go types.SizesFor 返回 nil 通常不是类型没有大小,而是 compiler 与 arch 组合未知。本文区分 GOOS、GOARCH 与编译器参数,说明 Config.Sizes 的默认路径,并给出显式处理 nil、区分 Sizeof 负数的实战写法。475 收藏 -
Go types.Sizes.Alignof 描述目标模型中的对齐要求,不能直接代替字段偏移或填充。本文用结构体示例配合 Offsetsof、Sizeof,说明架构选择与布局报告的边界。241 收藏 -
修改 Go AST 后,旧的 types.Info 不会自动重算。本文结合 AST 节点、FileSet、Info 和 Checker 的关系,说明如何判断旧结果失效,并用新的检查上下文重新获得类型信息。254 收藏 -
讲清 Go types.SizesFor 如何按 compiler 和 arch 选择布局模型,并用 types.Sizes 计算类型对齐、字段偏移与总大小,覆盖 nil、padding 和跨架构报告边界。443 收藏 -
Go 自建类型检查器应沿用解析阶段的 FileSet。本文用双文件示例说明声明位置、类型诊断与文件行列的对应关系,并解释复用范围及源码更新边界。228 收藏 -
go/types 检查返回错误后,types.Info 里已经收集的定义、引用和表达式类型并不会自动全部失效,但它们只代表局部结果。本文说明如何结合 Package.Complete、map 查找和 nil 判断安全使用这些信息。115 收藏 -
go/types.Config.Error 不设置时,类型检查通常在首个错误处停止。本文用原创示例说明如何通过回调收集多个 types.Error,区分 Check 返回的首个错误、次生错误与不完整的 Package,并封装成源码分析工具可复用的写法。149 收藏 -
go/types.Checker.Files 要把源码作为同一个 Go 包的一部分来检查,因此不同 package 声明的文件不能混在同一个 Checker 中。本文区分包名、导入路径和外部测试包,给出增量检查与拆分上下文的排障方法。420 收藏 -
Go 的联合约束项换顺序后,String() 可能不同,但只要代表的类型集合相同,go/types.Identical 就应按语义判断为等价。本文结合 Union、Term.Tilde、Term.Type 和稳定展示键,说明如何避免把语法顺序误当成类型身份。349 收藏 -
用 go/types.NewTerm 创建联合项,再用 types.NewUnion 组装 int 与 ~string 等类型集合,并说明嵌入接口约束、读取成员和检查重叠边界的方法。468 收藏 -
同包多个 AST 文件应共享 FileSet 与 Checker,一次提交相关声明。示例展示包作用域和诊断收集,并说明文件选择、依赖导入与增量检查边界。464 收藏