go version这个命令相信大家已经非常熟悉了,使用它可以查看我们自己电脑上的Go SDK版本。
$ go version
go version go1.15 darwin/amd64
以上就是我们经常使用到的功能,可以查看自己的Go版本和系统架构的信息。 但是这其实是go version最基本的用法,因为我们没有为它提供更多的参数信息,所以它默认的打印的是go
这个可执行文件的版本信息。
go
这个命令工具,可以使用help
子命令查看任意命令的帮助。
$ go help version
usage: go version [-m] [-v] [file ...]
Version prints the build information for Go executables.
Go version reports the Go version used to build each of the named
executable files.
If no files are named on the command line, go version prints its own
version information.
显示的帮助内容比较多,我截取一部分。从该命令的用法来看,它可以接受多个文件,用于打印这些文件的构建版本信息。现在我来通过一些例子演示该命令的高级用法。
$ go version goimports
goimports: go1.13
传递goimports
这个可执行文件的路径给go version
命令,就可以打印出goimports
这个可执行文件的构建版本信息,从结果看,我电脑里的goimports
是使用go1.13
版本构建的。
同样的,可以依次查看多个文件的构建版本信息。
$ go version goimports gocode
goimports: go1.13
gocode: go1.13
从结果看,这两个工具的构建版本一样,都是使用go1.13
。
小提示:传递给go version的文件要是绝对路径,以上示例是因为我正好在$GOBIN目录下,所以可以省略路径,直接使用文件名。
更简便的是,你还可以把一个目录传给go version
,他可以打印出目录下所有可执行文件的构建信息。
$ go go version bin/
bin/basic: go1.13
bin/dlv: go1.13
bin/fillstruct: go1.13
bin/go-callvis: go1.13
bin/go-outline: go1.13
bin/go-symbols: go1.13
bin/gocode: go1.13
bin/gocode-gomod: go1.13
bin/godef: go1.13
bin/godoctor: go1.13
bin/goimports: go1.13
bin/golint: go1.14.4
bin/gomobile: go1.13
bin/gomodifytags: go1.13
bin/gopkgs: go1.13
bin/goplay: go1.13
bin/gorename: go1.13
bin/goreturns: go1.13
bin/gotests: go1.13
bin/main: go1.15
bin/protoc-gen-go: go1.13
通过go version
命令可以查看一个可执行文件的go mod信息,相信不少人还不知道这一点,这可是一个核武器的功能。
$ go version -m gocode
gocode: go1.13
path github.com/mdempsky/gocode
mod github.com/mdempsky/gocode v0.0.0-20190203001940-7fb65232883f h1:ee+twVCignaZjt7jpbMSLxAeTN/Nfq9W/nm91E7QO1A=
dep golang.org/x/tools v0.0.0-20191018212557-ed542cd5b28a h1:UuQ+70Pi/ZdWHuP4v457pkXeOynTdgd/4enxeIO/98k=
如上所示,只需要加一个-m
标识就可以打印出go mod信息。比如gocode
的,可以看出它的github地址是github.com/mdempsky/gocode
,模块名也一样,并且依赖了golang.org/x/tools
库,并且还显示了库的版本。
是不是非常清晰,当我们研究一个可执行文件的时候非常有用,因为你可以看到它的地址,它依赖了哪些第三方库。
go version
有这么好的功能,也是有限制的,它只能查看Go语言编译生成的可执行文件。这个相信从上面的示例中也可以看出来,因为显示的这些构建版本信息都是Go语言相关的,其他语言也没有这些,所以其他语言生成的文件也就无法支持。比如我以ping
命令为例:
$ go version /sbin/ping
/sbin/ping: go version not found
提示找不到相关的go版本信息,这个是很正常的,因为ping
不是Go编译生成的可执行文件。
Go为我们提供了不少好用的工具,可能都隐藏在角落里,如果你仔细找,会有意想不到的收获。