问题来源
在用go get
安装包时提出了一个这样的报错
$ go install gods
can't load package: package gods: cannot find package "gods" in any of:
该报错提示我们不存在go文件;gods目录中确实也不包括go文件;那么这引出了问题,我们为什么要进行go install
呢?
程序编译的四步
如C语言
- 预编译
- 编译
- 汇编: 到这一步由高级语言→汇编语言→机器语言(二进制)→
.o
文件 - 链接: 将上述翻译后的`.o``文件与库文件(动态库和静态库)链接→可执行文件
在go语言中的四步参考
如我们现在文件目录如下:
—— ~/Documents/go_work/src
—— package1/
—— 1.go
—— 2.go
—— 3.go
—— test/
—— main.go
其中package1中均是在package package1
包作用域下的子文件
3.go
中包含一个函数GetA
可以打印"Ok!"
main.go
如下
package main
import (
"package1"
)
func main() {
package1.GetA("tmp")
}
直接go run
运行
go run main.go
// Ok!
此时使用go build main.go
将会在当前路径产生main.exe
如果删除package1
中的对应.go
文件,将无法编译
问题: 那么是否可以不提供package1
的源代码.go
文件,像上述链接方式一样,通过调用package1
的编译中间文件来使main.go
正确运行呢?
可以!
1. 产生库静态文件.a
go install package1
上述代码会在pkg/
中对应目录下产生.a
静态库文件
2. 产生机器码文件.o
path="~/Documents/go_work/src/test"
go tool compile -I ~/Documents/go_work/pkg/windows_amd64/ main.go
上述代码会在path
下产生一个main.o
文件
-I
表示存放.a
文件的目录,因为不同包在import
时也会有对应包层级结构,因此导入.a
文件的根目录即可
3. 产生可执行文件
go tool link -o main.exe -L ~/Documents/go_work/pkg/windows_amd64/ main.o
上述代码会在path
下产生一个main.exe
文件
执行该文件,打印"Ok!"
可以验证,如果删除了package1
中的对应.go
文件,将依然可以按照上述三步进行正确编译;但是编译所需要的所有.a
文件均应在传入的库的相应目录下
浅谈go install
go语言的工作区是什么?
小议并实战go包------顺便说说go中的GOROOT,GOPATH和src,pkg,bin
- 针对命令源码文件和库源码文件,命令源码文件除了会产生所需库文件
.a
外,还会在bin
下生成可执行文件 - 我的理解:对于我们要安装的包,如果不进行
go install
这一步,应该只在编译期间链接时由于找不到库文件会降低编译速度,但是最终程序运行是不受影响的
最后,装包
go get
git clone + go install
不计编译成本的话,直接存到src目录里