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 可以看到临时的工作目录:

文章插图
从上图中可以看到,仍然是先编译,再连接,最后直接执行,并打印出了执行结果 。
第一行打印的就是工作目录,最终生成的可执行文件就是放置于此:

文章插图
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/
推荐阅读
- 详解3种区别Linux服务器是物理机或者虚拟机的方法
- 详解Docker可视化管理工具shipyard--部署教程及功能展示
- 绝对经典,看了必会 linux中部署mysql主从同步示例详解
- 详解Oracle数据库物理设计--表和索引设计建议
- 详解微服务技术中进程间通信
- ”什么是内网穿透“详解
- 局域网中NAT具体工作过程详解
- MySQL执行计划命令EXPLAIN详解
- 静态路由详解
- 计算机启动过程详解
