在windows上编译自举后的Go源码安装Go

最近想着趁着毕业前深入研究一下Go源码,当然最好是下载一个新的Go源码来练习。不然会干扰到正常Go程序的编译使用。同时走一下从源码编译Go编译器的步骤。

1. 在windows上编译自举后的Go源码安装Go

  • 首先,Go现在的版本早已经自举,自举即用Go来完成了Go的编译器的编写,所以现在编译最新的Go1.17需要已经安装好了一个Go编译器,这里就不赘述如何不从源码安装Go程序了。本文编译的Go源码为1.17

  • 首先,到github上下载go的源码并解压(go github)

  • 注意,go的源码路径最好不要有中文字符,否则编译的时候会出问题,同时,在与src同级目录下,加一个名为VERSION的文件,指定go的版本,不然编译时会报错。如在VERSION文件中随便写个1.17.1版本

go 1.17.1
  • 下一步,打开src下的make.bat文件,我们需要指定已经安装好的编译器的可执行文件路径:将下面代码所示的%HOMEDRIVE%%HOMEPATH%\Go1.4改为已经安装好的Go的目录,我的Go目录是D:\Program Files\Go
if "x%GOROOT_BOOTSTRAP%"=="x" if exist "%HOMEDRIVE%%HOMEPATH%\go1.17" set GOROOT_BOOTSTRAP=%HOMEDRIVE%%HOMEPATH%\go1.17
if "x%GOROOT_BOOTSTRAP%"=="x" if exist "%HOMEDRIVE%%HOMEPATH%\sdk\go1.17" set GOROOT_BOOTSTRAP=%HOMEDRIVE%%HOMEPATH%\sdk\go1.17
if "x%GOROOT_BOOTSTRAP%"=="x" set GOROOT_BOOTSTRAP=%HOMEDRIVE%%HOMEPATH%\Go1.4
  • 最后,打开cmd,执行make.bat即可,执行完成后,src同级目录下将出现bin,pkg目录,里面将会有编译好的go.exe和编译器等工具,我们用这个go.exe查看版本号,显示的将是我们上面在版本文件里写的名字
>go.exe version
go version go 1.17.1 windows/amd64

2. 修改源码练习

  • 到这里Go已经算是安装完成了,我们可以修改Go源码并验证Go各工具是否可以正常编译Go程序,拿fmt.Println函数来举例:Println函数在src\fmt\print.go中。这里添加一行打印
func Println(a ...any) (n int, err error) {
	println("Bioit") // 我们加一行打印
	return Fprintln(os.Stdout, a...)
}
  • 检验:编写如下go文件,使用刚编译的go编译器编译运行,看是否多一行输出
package main

import "fmt"

func main() {
	fmt.Println("Hello")
}
>go.exe run main.go
Bioit
Hello
  • windows系统中,当我们有多个Go时,最好不要设置GOROOT环境变量,可以在用到某个Go时设置一下(go.exe env -w GOROOT=想用的Go所在路径)。这样生效简单。
其实,当我们把上面的步骤提前到编译Go各工具前面的时候,Go各工具源码中使用到fmt.Println的时候也都会多出一行打印。比如,当提前到Go被编译之前修改Println,全路径调用新编译的go.exe tool,就会发现所有输出多一行。而编译后修改源码,且GOROOT设置为修改过源码的Go路径,此时才会影响我们自己写的调用了fmt.Println的代码。因为Go编译器将在GOROOT指定的目录中寻找标准库以及GOPATH中寻找第三方库。

你可能感兴趣的:(Go,golang,开发语言,后端)