获取golang源码
假设本地已安装golang的其他版本,首先从github上来获取golang的源码: https://github.com/golang/go
如果网络比较差无法clone源码,可以先从github上导入到gitee上,然后从gitee上git clone 源码
修改源码
进入src/fmt/print.go 源码
修改如下源码:
// Println formats using the default formats for its operands and writes to standard output.
// Spaces are always added between operands and a newline is appended.
// It returns the number of bytes written and any write error encountered.
func Println(a ...any) (n int, err error) {
println("This is a test") // 修改的部分
return Fprintln(os.Stdout, a...)
}
编译源码
cd src
./make.bash
测试运行
需要在当时控制台设置临时环境变量, ./localhost
为测试编译后的源码的目录
export GOROOT=/Users/xiaopeng/go/src/golang
export GOPATH=/Users/xiaopeng/go/src/golang/localhost
export GOBIN=${GOPATH}/bin
export PATH=${PATH}:${GOBIN}:${GOROOT}/bin
然后通过已经编译好的go工具包,运行测试的golang代码:
./localhost/src/localtest/chap1/main.go
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
通过自编译的go工具包运行当前的go文件:
./bin/go run ./localhost/src/localtest/chap1/main.go
输出结果如下:
This is a test
Hello World
编译优化
golang需要编译成二进制文件,在编译过程中会有中间代码生成阶段。
golang编译成汇编语言,通过汇编语言分析程序具体执行过程:
➜ golang git:(master) ✗ ./bin/go build -gcflags -S ./localhost/src/localtest/chap1/main.go
如果想了解更详细的过程,通过如下命令获取汇编指令的优化过程:
➜ golang git:(master) ✗ GOSSAFUNC=main ./bin/go build -gcflags -S ./localhost/src/localtest/chap1/main.go
此时会在源码的更目录下生成ssa.html文档: