go命令行工具

0. go交叉编译

1. mac下编译linux程序

  • GOOS=linux GOARCH=amd64 go build hello.go

1. go version

  1. 看go语言版本

    	$ go version
    go version go1.14.4 darwin/amd64
  2. 查看go文件的构建版本信息

    • 文件路径可以要加绝对路径

    • 可以看多个文件,也可以直接指定目录

    	 $ go version /Users/dxm/go/src/beeserver/beeserver
      /Users/dxm/go/src/beeserver/beeserver: go1.14.4
      
      // 目录
     $ go version /Users/dxm/go/src/beeserver
      /Users/dxm/go/src/beeserver/beeserver: go1.14.4
      /Users/dxm/go/src/beeserver/go_build_main_go: go1.14.4
  3. 查看go可执行文件的包依赖信息(查看go mod信息)

    • 加个-m参数就行

    	$ go version -m /Users/dxm/go/src/beeserver/beeserver
    /Users/dxm/go/src/beeserver/beeserver: go1.14.4
        path	beeserver
        mod	beeserver	(devel)
        dep	github.com/astaxie/beego	v1.12.2	h1:CajUexhSX5ONWDiSCpeQBNVfTzOtPb9e9d+3vuU5FuU=
        dep	github.com/beorn7/perks	v1.0.1	h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
        dep	github.com/cespare/xxhash/v2	v2.1.1	h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
        dep	github.com/go-sql-driver/mysql	v1.5.0	h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
        dep	github.com/golang/protobuf	v1.4.2	h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
        dep	github.com/hashicorp/golang-lru	v0.5.4	h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
        dep	github.com/matttproud/golang_protobuf_extensions	v1.0.1	h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
        dep	github.com/prometheus/client_golang	v1.7.0	h1:wCi7urQOGBsYcQROHqpUUX4ct84xp40t9R9JX0FuA/U=
        dep	github.com/prometheus/client_model	v0.2.0	h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
        dep	github.com/prometheus/common	v0.10.0	h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc=
        dep	github.com/prometheus/procfs	v0.1.3	h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
        dep	github.com/shiena/ansicolor	v0.0.0-20151119151921-a422bbe96644	h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo=
        dep	golang.org/x/crypto	v0.0.0-20191011191535-87dc89f01550	h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
        dep	golang.org/x/net	v0.0.0-20190620200207-3b0461eec859	h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
        dep	golang.org/x/sys	v0.0.0-20200615200032-f1bc736245b1	h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80=
        dep	golang.org/x/text	v0.3.0	h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
        dep	google.golang.org/protobuf	v1.23.0	h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
        dep	gopkg.in/yaml.v2	v2.2.8	h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
  4. 注意只能查看Go语言编译生成的可执行文件

2. go run

  1. go run命令包含了两个动作:编译命令源码文件和运行对应的可执行文件。

  2. go run命令只接受Go源码文件作为参数,而不接受代码包。与go build命令和go install命令一样,go run命令也不允许多个命令源码文件作为参数,即使它们在同一个代码包中也是如此。而原因也是一致的,多个命令源码文件都有相同的main函数声明。

  3. go run -n test.go 只打印相关命令而不执行

  4. go run -x -work test.go 既打印相关命令又执行

    • -work 是打印临时工作目录的名称,并在退出时不删除它(少用)。

3. go build

  1. 编译规则

    • 如果参数为***.go文件或文件列表,则编译为一个个单独的包。

    • 当编译单个main包(文件),则生成可执行文件。

    • 当编译单个或多个包非主包时,只构建编译包,但丢弃生成的对象(.a),仅用作检查包可以构建。即最后不会生成可执行文件。

    • 当编译包时,会自动忽略'_test.go'的测试文件。

  2. 主要作用

    • 用于测试编译包,在项目目录下生成可执行文件(有main包)。

  3. go build指令会调用所有引用包的源码,重新编译,而不是直接使用pkg里的编译后文件,如果在【$GOROOT】与【$GOPATH】下没有找到import引入包的项目源码,就会报错。

4. go install

  1. 主要作用

    • 主要用来生成库和工具。一是编译包文件(无main包),将编译后的包文件放到 pkg 目录下($GOPATH/pkg)。二是编译生成可执行文件(有main包),将可执行文件放到 bin 目录($GOPATH/bin)。

  2. 和go build的不同点

    • go build 不能生成包文件, go install 可以生成包文件

    • go build 生成可执行文件在当前目录下, go install 生成可执行文件在bin目录下($GOPATH/bin),这样就可以使项目可执行文件能被方便的全局调用。

    • go install 输出目录始终为 GOPATH 下的 bin 目录,无法使用-o附加参数进行自定义。

  3. GOPATH 下的 pkg 目录放置的是编译期间的中间文件。(.a)

    • 每个package都会生成对应的.a文件,Go在install的时候先判断package是否有改动,如果没有就不再编译.a文件,加快编译速度。

    • build的话强制全部编译

    • 只把.a文件给别人,别人是用不了的,必须得要源码。

5. go get

  1. go get 可以暂时理解为git clone 到 $GOPATH/src + go install

  2. 用法:

  3. 标记名称 描述 -d 让命令程序只执行下载动作,而不执行安装动作。 -f 仅在使用-u标记时才有效。该标记会让命令程序忽略掉对已下载代码包的导入路径的检查。如果下载并安装的代码包所属的项目是你从别人那里Fork过来的,那么这样做就尤为重要了。 -fix 让命令程序在下载代码包后先执行修正动作,而后再进行编译和安装。 -insecure 允许命令程序使用非安全的scheme(如HTTP)去下载指定的代码包。如果你用的代码仓库(如公司内部的Gitlab)没有HTTPS支持,可以添加此标记。请在确定安全的情况下使用它。 -t 让命令程序同时下载并安装指定的代码包中的测试源码文件中依赖的代码包。 -u 让命令利用网络来更新已有代码包及其依赖包。默认情况下,该命令只会从网络上下载本地不存在的代码包,而不会更新已有的代码包。 -v 打印出被构建的代码包的名字 -x 打印出用到的命令

6. go mod

  1. 自从 Go 官方从去年推出 1.11 之后,增加新的依赖管理模块并且更加易于管理项目中所需要的模块。模块是存储在文件树中的 Go 包的集合,其根目录中包含 go.mod 文件。 go.mod 文件定义了模块的模块路径,它也是用于根目录的导入路径,以及它的依赖性要求。每个依赖性要求都被写为模块路径和特定语义版本。

1. 使用module的前置工作

2. 常见操作

  1. 创建一个新模块

    • go mod init hello 初始化一个module名字为 hello 的模块,生成一个go.mod文件。

  2. 添加依赖

    • 在代码中直接import,go build后会自动添加

  3. 升级依赖项

    • 查看使用的依赖列表:go list -m all

    • go tidy 下载更新依赖

  4. 删除未使用的依赖项

    • go mod tidy

3. go mod参数

7. go test

1. 测试文件

1. 测试目录所有文件

  • go的test一般以xxx_test.go为文件名,xxx并没有特别要求是要实测的文件名

  • 在当前目录下使用 go test 会运行当前目录下所有的 test 文件。

2. 测试单个文件

  • 测试单个文件,一定要带上被测试的原文件

  • go test -v wechat_test.go wechat.go

3. 测试单个函数

  • go test -v -test.run TestRefreshAccessToken

2. 四种测试用例

  1. TestXxxx(t *testing.T) // 基本测试用例

    • go test 不会按照顺序执行多个 test case。若想要顺序执行,需要用到 subtests 。用 t.Run 来执行 subtests 可以做到控制顺序的作用。

  2. BenchmarkXxxx(b *testing.B) // 压力测试的测试用例

    • 执行命令 go test -bench=. 输入该命令后,go test 只会测试 Benchmark 开头的函数

    • benchmark 的 case 一般会跑 b.N 次,而且每次执行都会如此

    • 在执行过程中会根据实际 case 的执行时间是否稳定会增加 b.N 的次数以达到稳态

  3. Example_Xxx() // 测试控制台输出的例子

  4. TestMain(m *testing.M) // 测试Main函数

    • TestMain 作为初始化 test。作为入口 test。可以在 m.Run() 之前初始化一些东西,比如数据库连接、文件打开。

3. test两种运行模式

  1. 本地目录模式,在没有包参数(例如 go test 或 go test -v )调用时发生。在此模式下, go test 编译当前目录中找到的包和测试,然后运行测试二进制文件。在这种模式下,caching 是禁用的。在包测试完成后,go test 打印一个概要行,显示测试状态、包名和运行时间。

  2. 包列表模式,在使用显示包参数调用 go test 时发生(例如 go test math , go test ./... 甚至是 go test . )。在此模式下,go 测试编译并测试在命令上列出的每个包。如果一个包测试通过, go test 只打印最终的 ok 总结行。如果一个包测试失败, go test 将输出完整的测试输出。如果使用 -bench 或 -v 标志,则 go test 会输出完整的输出,甚至是通过包测试,以显示所请求的基准测试结果或详细日志记录。

8. go env

  1. 命令go env用于打印Go语言的环境信息。

9. go fix

  1. 命令go fix会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。这里所说的版本即Go语言的版本。代码包的所有Go语言源码文件不包括其子代码包(如果有的话)中的文件。修正操作包括把对旧程序调用的代码更换为对新程序调用的代码、把旧的语法更换为新的语法,等等。

  2. 命令go fix其实是命令go tool fix的简单封装。这甚至比go fmt命令对gofmt命令的封装更简单。像其它的Go命令一样,go fix命令会先对作为参数的代码包导入路径进行验证,以确保它是正确有效的。像在本小节开始处描述的那样,go fix命令会把有效代码包中的所有Go语言源码文件作为多个参数传递给go tool fix命令。实际上,go fix命令本身不接受任何标记,它会把加入的所有标记都原样传递给go tool fix命令。

  3. go tool fix命令可接受的标记如下表

    标记名称 标记描述 -diff 不将修正后的内容写入文件,而只打印修正前后的内容的对比信息到标准输出。 -r 只对目标源码文件做有限的修正操作。该标记的值即为允许的修正操作的名称。多个名称之间用英文半角逗号分隔。 -force 使用此标记后,即使源码文件中的代码已经与Go语言的最新版本相匹配了,也会强行执行指定的修正操作。该标记的值就是需要强行执行的修正操作的名称,多个名称之间用英文半角逗号分隔。

10. go fmt

  1. go fmt命令会按照Go语言代码规范格式化指定代码包中的所有Go语言源码文件的代码,所有Go语言源码文件即包括命令源码文件、库源码文件和测试源码文件。注意,当代码包还有子代码包时,子代码包中的Go语言源码文件是不包含在内的。也就是说,go fmt命令只会格式化被直接保存在指定代码包对应目录下的Go语言源码文件。

  2. 与go doc命令和godoc命令的关系类似,go fmt命令是gofmt命令的简单封装。go fmt命令本身可以接受两个标记。标记-n可以让命令程序仅打印出内部使用的gofmt命令及其标记和参数而不真正执行它。标记-x则会使命令程序既打印又执行这个命令。在go fmt命令程序内部,会在其调用的gofmt命令后面加上标记-l和-w,并以指定代码包中的所有Go语言源码文件的路径作为参数,就像这样:

11. go doc

  1. go doc fmt

    • 用于展示指定代码包fmt的文档

  2. godoc -http=localhost:6060 -index

    • 在本地指定web服务,网页查看文档

    • -index是指定搜索功能

12. go clean

  1. 执行go clean命令会删除掉执行其它命令时产生的一些文件和目录,包括:

    • 在使用go build命令时在当前代码包下生成的与包名同名或者与Go源码文件同名的可执行文件。在Windows下,则是与包名同名或者Go源码文件同名且带有“.exe”后缀的文件。

    • 在执行go test命令并加入-c标记时在当前代码包下生成的以包名加“.test”后缀为名的文件。在Windows下,则是以包名加“.test.exe”后缀为名的文件。

    • 如果执行go clean命令时带有标记-i,则会同时删除安装(执行go install命令)当前代码包时所产生的结果文件。如果当前代码包中只包含库源码文件,则结果文件指的就是在工作区的pkg目录的相应目录下的归档文件。如果当前代码包中只包含一个命令源码文件,则结果文件指的就是在工作区的bin目录下的可执行文件。

    • 还有一些目录和文件是在编译Go或C源码文件时留在相应目录中的。包括:“_obj”和“_test”目录,名称为“_testmain.go”、“test.out”、“build.out”或“a.out”的文件,名称以“.5”、“.6”、“.8”、“.a”、“.o”或“.so”为后缀的文件。这些目录和文件是在执行go build命令时生成在临时目录中的。

    • 如果执行go clean命令时带有标记-r,则还包括当前代码包的所有依赖包的上述目录和文件。

13. go list

  1. go list -e -json fmt 查看fmt包的信息

14. go vet

  1. 命令go vet是一个用于检查Go语言源码中静态错误的简单工具。与大多数Go命令一样,go vet命令可以接受-n标记和-x标记。-n标记用于只打印流程中执行的命令而不真正执行它们。-n标记也用于打印流程中执行的命令,但不会取消这些命令的执行。

  2. go vet命令是go tool vet命令的简单封装。它会首先载入和分析指定的代码包,并把指定代码包中的所有Go语言源码文件和以“.s”结尾的文件的相对路径作为参数传递给go tool vet命令。其中,以“.s”结尾的文件是汇编语言的源码文件。如果go vet命令的参数是Go语言源码文件的路径,则会直接将这些参数传递给go tool vet命令。

  3. go tool vet命令的作用是检查Go语言源代码并且报告可疑的代码编写问题。比如,在调用Printf函数时没有传入格式化字符串,以及某些不标准的方法签名,等等。该命令使用试探性的手法检查错误,因此并不能保证报告的问题确实需要解决。但是,它确实能够找到一些编译器没有捕捉到的错误。

15. go generate

1. 概述

  1. go generate命令是go 1.4版本里面新添加的一个命令,当运行go generate时,它将扫描与当前包相关的源代码文件,找出所有包含"//go:generate"的特殊注释,提取并执行该特殊注释后面的命令,命令为可执行程序,形同shell下面执行。

2. 使用场景

  1. protobufs:从 protocol buffer 定义文件(.proto)生成 .pb.go 文件。

  2. Unicode:从 UnicodeData.txt 生成 Unicode 表.

3. 例子

最后更新于

这有帮助吗?