如何学习go的源码
举个例子,比如我创建了slice.go
package main
import "fmt"
func main() {
slice := make([]int, 0)
slice = append(slice, 1)
fmt.Println(slice, len(slice), cap(slice))
}
如何去解读slice的append和初始化的源码呢?
可以在终端执行:
go tool compile -S slice.go |grep CALL
我们可以得到如下的汇编代码:
0x0042 00066 (slice.go:6) CALL runtime.makeslice(SB)
0x006d 00109 (slice.go:7) CALL runtime.growslice(SB)
0x00a4 00164 (slice.go:8) CALL runtime.convTslice(SB)
0x00bc 00188 (slice.go:8) CALL runtime.convT64(SB)
0x00d4 00212 (slice.go:8) CALL runtime.convT64(SB)
0x0163 00355 ($GOROOT/src/fmt/print.go:275) CALL fmt.Fprintln(SB)
0x0178 00376 (slice.go:5) CALL runtime.morestack_noctxt(SB)
0x0040 00064 (<autogenerated>:1) CALL runtime.nilinterhash(SB)
0x0067 00103 (<autogenerated>:1) CALL runtime.morestack_noctxt(SB)
0x007f 00127 (<autogenerated>:1) CALL runtime.efaceeq(SB)
0x00a9 00169 (<autogenerated>:1) CALL runtime.morestack_noctxt(SB)
0x0032 00050 (<autogenerated>:1) CALL runtime.throwinit(SB)
0x0040 00064 (<autogenerated>:1) CALL fmt.init(SB)
0x0055 00085 (<autogenerated>:1) CALL runtime.morestack_noctxt(SB)
可以通过上述这种方式,可以获得每行go语言运行哪些方法,便可有目的的去学习go源码