(//go:binary-only-package) 的使用

133 阅读2分钟

前言,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 文件里面的函数