1.3 基本技巧

    Go语言的源代码布局是有一些规律的。假定读者在$GOROOT下:

    学习Go语言的内部实现,主要依靠对源代码的分析,所以阅读源代码是很好的方式。linus谈到如何学习Linux内核时也说过”Read the F**ing Source code”。

    通过gdb下断点,跟踪程序的行为。调试跟代码的方式是源代码阅读的一种辅助手段。

    1. import (
    2. "fmt"
    3. fmt.Println("hello world!")

    编译,调试

    可以在main.main处下断点,单步执行,你会发现进入了一个runtime·convT2E的函数。这个就是由于fmt.Println接受的是一个interface,而传入的是一个string,这里会做一个转换。以这个为一个突破点去跟代码,就可以研究Go语言中具体类型如何转为interface抽象类型。

    有时候分析会需要研究生成的汇编代码,这里介绍生成汇编代码的方法。

    1. go tool 6g -S hello.go

    或者可以反汇编生成的可执行文件:

    1. go build test.go

    本机是amd64的机器,如果是i386的机器,则命令是8g

    需要注意的是用6g的-S生成的汇编代码和6l -a生成的反汇编代码是不太一样的。前者是直接对源代码进行汇编,后者是对可执行文件进行反汇编。在6l进行链接过程中,可能会在原汇编文件基础上插入新的指令。所以6l反汇编出来的是最接近真实代码的。