万字长文详解 Go 程序是怎样跑起来的?( 七 )


go install
go install 用于编译并安装指定的代码包及它们的依赖包 。相比 go build,它只是多了一个“安装编译后的结果文件到指定目录”的步骤 。
还是使用之前 hello-world 项目的例子,我们先将 pkg 目录删掉,在项目根目录执行:
go install src/main.go 或者go install util两者都会在根目录下新建一个 pkg 目录,并且生成一个 util.a 文件 。
并且,在执行前者的时候,会在 GOBIN 目录下生成名为 main 的可执行文件 。
所以,运行 go install 命令,库源码包对应的 .a 文件会被放置到 pkg 目录下,命令源码包生成的可执行文件会被放到 GOBIN 目录 。
go install 在 GoPath 有多个目录的时候,会产生一些问题,具体可以去看郝林老师的 Go命令教程,这里不展开了 。
go run
go run 用于编译并运行命令源码文件 。
在 hello-world 项目的根目录,执行 go run 命令:
go run -x -work src/main.go-x 可以打印整个过程涉及到的命令,-work 可以看到临时的工作目录:

万字长文详解 Go 程序是怎样跑起来的?

文章插图
从上图中可以看到,仍然是先编译,再连接,最后直接执行,并打印出了执行结果 。
第一行打印的就是工作目录,最终生成的可执行文件就是放置于此:
万字长文详解 Go 程序是怎样跑起来的?

文章插图
main 就是最终生成的可执行文件 。
6.总结
这次的话题太大了,困难重重 。从编译原理到 go 启动时的流程,到 go 命令原理,每个话题单独抽出来都可以写很多 。
幸好有一些很不错的书和博客文章可以去参考 。这篇文章就作为一个引子,你可以跟随参考资料里推荐的一些内容去发散 。
参考资料
  • 【《程序员的自我修养》全书】https://book.douban.com/subject/3652388/
  • 【面向信仰编程 编译过程概述】https://draveness.me/golang-compile-intro
  • 【golang runtime 阅读】https://github.com/zboya/golangruntimereading
  • 【Go-Questions hello-world项目】https://github.com/qcrao/Go-Questions/tree/master/examples/hello-world
  • 【雨痕大佬的 Go 语言学习笔记】https://github.com/qyuhen/book
  • 【vim 以 16 进制文本】https://www.cnblogs.com/meibenjin/archive/2012/12/06/2806396.html
  • 【Go 编译命令执行过程】https://halfrost.com/go_command/
  • 【Go 命令执行过程】https://github.com/hyper0x/gocommandtutorial
  • 【Go 词法分析】https://ggaaooppeenngg.github.io/zh-CN/2016/04/01/go-lexer-%E8%AF%8D%E6%B3%95%E5%88%86%E6%9E%90/
  • 【曹大博客 golang 与 ast】http://xargin.com/ast/
  • 【Golang 词法解析器,scanner 源码分析】https://blog.csdn.net/zhaoruixiang1111/article/details/89892435
  • 【Gopath Explained】https://flaviocopes.com/go-gopath/
  • 【Understanding the GOPATH】https://www.digitalocean.com/community/tutorials/understanding-the-gopath
  • 【讨论】https://stackoverflow.com/questions/7970390/what-should-be-the-values-of-gopath-and-goroot
  • 【Go 官方 Gopath】https://golang.org/cmd/go/#hdr-GOPATHenvironmentvariable
  • 【Go package 的探索】https://mp.weixin.qq.com/s/OizVLXfZ6EC1jI-NL7HqeA
  • 【Go 官方 关于 Go 项目的组织结构】https://golang.org/doc/code.html
  • 【Go modules】https://www.melvinvivas.com/go-version-1-11-modules/
  • 【Golang Installation, Setup, GOPATH, and Go Workspace】https://www.callicoder.com/golang-installation-setup-gopath-workspace/
  • 【编译、链接过程链接】https://mikespook.com/2013/11/%E7%BF%BB%E8%AF%91-go-build-%E5%91%BD%E4%BB%A4%E6%98%AF%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%E7%9A%84%EF%BC%9F/
  • 【1.5 编译器由 go 语言完成】https://www.infoq.cn/article/2015/08/go-1-5
  • 【Go 编译过程系列文章】https://www.ctolib.com/topics-3724.html
  • 【曹大 go bootstrap】https://github.com/cch123/golang-notes/blob/master/bootstrap.md
  • 【golang 启动流程】https://blog.iceinto.com/posts/go/start/
  • 【探索 golang 程序启动过程】http://cbsheng.github.io/posts/%E6%8E%A2%E7%B4%A2golang%E7%A8%8B%E5%BA%8F%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B/
  • 【探索 goroutine 的创建】http://cbsheng.github.io/posts/%E6%8E%A2%E7%B4%A2goroutine%E7%9A%84%E5%88%9B%E5%BB%BA/
版权声明:本文为CSDN博主「qcrao」的原创文章 。


推荐阅读