关于golang:Golang内部构件第2部分深入Go编译器

8次阅读

共计 838 个字符,预计需要花费 3 分钟才能阅读完成。

通过接口援用应用变量时,您是否晓得 Go 运行时中到底产生了什么?这不是一个小问题,因为在 Go 语言中,实现接口的类型不蕴含对该接口的任何援用。尽管如此,咱们仍能够尝试应用咱们对 Go 编译器的常识来答复它,这在上一篇博客文章中曾经探讨过。

因而,让咱们深入研究 Go 编译器:创立一个根本的 Go 程序,并查看 Go 类型转换的外部工作原理。以它为例,咱们将解释如何生成和利用节点树。因而,您能够进一步将此常识利用于其余 Go 编译器的性能。

在你开始之前

为了进行试验,咱们须要间接应用 Go 编译器(而不是 Go 工具)。您能够应用以下命令拜访它。

go tool 6g test.go

它将编译 test.go 源文件并创立一个指标文件。在这里,6g 是咱们计算机上具备 AMD64 架构的编译器的名称。请留神,对于不同的体系结构,应应用不同的编译器。

当咱们间接应用编译器时,咱们能够应用一些不便的命令行参数(更多详细信息在官网文档中)。为了本试验的目标,咱们须要 - W 标记,该标记将打印节点树的布局。

创立一个简略的 Go 程序

首先,咱们将创立一个示例 Go 程序。您将在上面找到咱们的版本。

package main
type 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 办法。后者在这里,因为它是为所有程序隐式定义的,但实际上咱们当初不在乎。

对于每种办法,编译器都会打印两个版本的节点树。第一个是咱们在解析源文件后取得的原始节点树。第二个是咱们通过类型查看并利用了所有必要批改后失去的版本。

正文完
 0