通过接口援用应用变量时,您是否晓得Go运行时中到底产生了什么? 这不是一个小问题,因为在Go语言中,实现接口的类型不蕴含对该接口的任何援用。 尽管如此,咱们仍能够尝试应用咱们对Go编译器的常识来答复它,这在上一篇博客文章中曾经探讨过。
因而,让咱们深入研究Go编译器:创立一个根本的Go程序,并查看Go类型转换的外部工作原理。 以它为例,咱们将解释如何生成和利用节点树。 因而,您能够进一步将此常识利用于其余Go编译器的性能。
在你开始之前
为了进行试验,咱们须要间接应用Go编译器(而不是Go工具)。 您能够应用以下命令拜访它。
go tool 6g test.go
它将编译test.go源文件并创立一个指标文件。 在这里,6g是咱们计算机上具备AMD64架构的编译器的名称。 请留神,对于不同的体系结构,应应用不同的编译器。
当咱们间接应用编译器时,咱们能够应用一些不便的命令行参数(更多详细信息在官网文档中)。 为了本试验的目标,咱们须要-W标记,该标记将打印节点树的布局。
创立一个简略的Go程序
首先,咱们将创立一个示例Go程序。 您将在上面找到咱们的版本。
package maintype I interface { DoSomeWork()}type T struct { a int}func (t *T) DoSomeWork() {}func main() { t := &T{} i := I(t) print(i)}
真的很简略,不是吗? 惟一仿佛不必要的是第17行,咱们在其中提供了i变量。 然而,如果没有它,我将放弃不应用状态,并且该程序将不会编译。 下一步是应用-W开关编译程序。
go tool 6g -W test.go
实现此操作后,您将看到蕴含程序中定义的每个办法的节点树的输入。 在咱们的状况下,这些是main和init办法。 后者在这里,因为它是为所有程序隐式定义的,但实际上咱们当初不在乎。
对于每种办法,编译器都会打印两个版本的节点树。 第一个是咱们在解析源文件后取得的原始节点树。 第二个是咱们通过类型查看并利用了所有必要批改后失去的版本。
略