前言,go install 的使用
我们将 go 代码放在 $GOPATH/src/lin/lin.go
下(其中 lin 是你自己起的 package 名),然后使用 go install
,你会在 $GOPATH/pak/linux_amd64/
下找到 lin.a
文件,也就是你所生成的静态库文件,你可以在其他程序中通过导包使用你的静态库文件。这里的(linux_amd64)是 $(go env GOOS)_$(go env GOARCH)
,也就是你自己的实际操作系统,你在 windows 下使用 go ,这里就是 windows 。
接下来是实例举例:
我把下述代码放在$GOPATH/src/lin/
文件夹下
package lin
func Hello() {
println("hello")
}
然后执行 go install
,我会在 $GOPATH/pkg/linux_amd64
下得到 lin.a
再之后,我们写一个新的 go 文件,如下
package main
import (
"lin"
)
func main() {
lin.Hello()
lin.Hello()
lin.Hello()
}
通过导入 lin
,你的屏幕可以输出 hello
。
接下来就是(//go:binary-only-package
) 的使用
也就是在 lin.go 文件的第一行加上这个注释,如下:
//go:binary-only-package
package lin
func Hello() {
println("hello")
}
然后你在执行 go install
,同样也会生成 lin.a
的文件,这两者有什么区别呢,首先使用上都可以通过导包来使用lin.Hello()
,(这里如果你把 $GOPATH/src/lin
文件删掉,也无法通过导入进行使用lin.Hello()
,所以这 .a
文件好像也没啥用,就起到一个加快编译的作用),但前者没有加注释的,可以通过 go tool objdump ./lin.a
来输出源码,而后者不可以,也就是说加注释你所生成的 .a
文件里面没有源码,别人也看不到。
当然从 go 1.13 版本之后 (//go:binary-only-package)
这个注释已经被弃用了,你现在在你的代码里面加上注释,然后使用 go install
,直接就报错了,是不会生成 .a
文件的,除非你用之前的版本,被弃用的原因也很简单,因为这个功能没人用。。。。
所以如果希望只使用 go install 所生成的 .a 文件来进行包的使用,只有 go 1.13 版本之前可以,带上 (//go:binary-only-package)
这个注释可以做到不需要源代码的情况下,只使用 .a
文件既可以导包使用 .a
文件里面的函数