编译器现在支持用于包导出数据的索引数据格式,从而能够高效地随机访问包数据。我们已经使用这种方法来实现声明的延迟扩展和内联体,但我们仍然在引用类型时完全展开它们。我预计在大型项目中,许多深层次的细节永远不需要,我们可以避免将这些数据读入内存。
我认为主要步骤是:
- 将剩余的 Type 字段隐藏在 setter/getter 方法后面。
- 创建一个新的 TSTUB 类型,并提供一种注册扩展函数的方法,该函数将 Type 重写为实际的 Go 类型。
- 添加一个
Type.expand
方法,用于检查 Etype==TSTUB 并调用扩展函数。 - 在每个(?)公共 Type 方法的顶部插入对
expand()
的调用。 - 更新 iimport.go 以创建 TSTUB 类型而不是普通类型。
另一个有用(但非关键)的步骤是审查 Type API,并尝试修剪/简化不必要的方法。这将减少我们需要用expand
调用进行监控的地方数量。
4条答案
按热度按时间wsxa1bj11#
乐观地标记为1.11,但冻结还有一周的时间,所以这可能会滑落。
uqjltbpv2#
https://golang.org/cl/109138提到了这个问题:
cmd/compile/internal/types: replace Type.Val with Type.Elem
bttbmeg03#
1.11版本不会发生这种情况。
bakd9h0s4#
对于1.12版本,这种情况也不会发生。