命令
命令
这里会介绍一些Go的常用命令,熟悉常用命令的使用对于开发来说非常重要。
bug bug报告
build 编译包和依赖
clean 清除缓存文件
doc 展示文档
env 打印环境信息
fix 根据新的API修复
generate 生成go文件
get 为当前模块下载依赖
list 列出依赖
mod 模块管理
run 编译并运行go程序
test 测试
tool 特殊工具
version 打印go版本
vet 报告错误
版本
查看当前go的版本
用法:go version
输出:go version go1.19.3 windows/amd64
帮助
帮助指令,当遇到不懂的命令时,使用help指令可以查看命令的详细解释
go help cmd
或者
go cmd -h
可以查看命令的基本用法和参数格式
示例
查看基本用法
PS C:\Users\Stranger> go run -h
usage: go run [build flags] [-exec xprog] package [arguments...]
Run 'go help run' for details.
查看详细用法和解释
PS C:\Users\Stranger> go help run
usage: go run [build flags] [-exec xprog] package [arguments...]
Run compiles and runs the named main Go package.
Typically the package is specified as a list of .go source files from a single
directory, but it may also be an import path, file system path, or pattern
matching a single known package, as in 'go run .' or 'go run my/cmd'.
......
环境
查看环境配置
go env
usage: go env [-json] [-u] [-w] [var ...]
,env命令总共有四个参数-json
: env命令输出的默认是shell脚本格式的配置,加上此参数后会以json格式输出环境配置-u
:此参数是用于取消一个配置的默认参数,等于直接把值置为空值,需要跟var参数-w
:此参数是用于永久修改环境配置
示例
json格式输出
PS C:\Users\Stranger> go env -json
{
"AR": "ar",
"CC": "gcc",
"CGO_CFLAGS": "-g -O2",
"CGO_CPPFLAGS": "",
"CGO_CXXFLAGS": "-g -O2",
"CGO_ENABLED": "1",
"CGO_FFLAGS": "-g -O2",
"CGO_LDFLAGS": "-g -O2",
"CXX": "g++",
...
}
取消一个配置的默认参数
go env -u GOBIN
修改配置
go env -w GO111MODULE=on
提示
并不是所有配置都可以通过go env -w
来修改,比如不能覆盖已有系统变量的配置
配置项
接下来介绍一下环境中几个比较重要的配置项
GO111MODULE
GO111MODULE
是Go在1.11版本引入的依赖管理项,考虑到向下兼容,并没有抛弃原有的GOPATH,总共有三个参数值。
on
: 寻找依赖时只会根据go.mod
文件下载依赖,也就是说完全忽略GOPATHoff
:寻找依赖时会在GOPATH和VENDER下寻找,忽略go.mod
auto
:自动判断,当在GOPATH目录下时,使用off
的功能,在GOPATH目录外时,使用on
的功能
GOBIN
go install
指定的安装目录
GOCACHE
用于存储使用Go命令而产生的缓存的目录
GOMODCACHE
用于存储下载的依赖库的目录
GOENV
指定名为env的配置文件的存放位置,env文件就是go env
的内容,无法使用go env -w
覆盖,只能通过系统变量来设置
GOPROXY
GO下载依赖的代理,由于Go的仓库在国外,国内一般都要代理。
GOROOT
安装Go语言的根目录
GOPATH
曾经用于解决导入项目的配置,现在几乎不用了,直接无视都可以。
运行
基本用法:go run [build flags] [-exec xprog] package [arguments...]
基本功能就是编译二进制文件并运行,且为了减少构建时间不会生成供调试器使用的信息。
build flags
:是构建标志,后续在build
命令时会讲到-exec xprog
:用xprog执行二进制文件arguments
:一些运行时参数
示例
运行当前目录下的go文件
go run .
运行指定目录下的go文件
'go run my/cmd
编译
基本用法:go build [-o output] [build flags] [packages]
基本功能就是根据导入的路径的编译命名,且会忽略掉测试文件,并生成可执行的二进制文件
示例
编译并在当前目录生成可执行的二进制文件
go build .
或者指定目录
go build ./example/ram
在指定位置生成指定名称的二进制执行文件
go build -o ./example/myexe.exe .
以上的例子就是大多数开发会用到的,当然实际上能做的事情远远不只这么点。
go build -gcflags="-N -l -S"
通过这个指令可以生成go汇编结果,
-l
禁止内联-N
编译时,禁止优化-S
输出汇编代码
main.main STEXT size=190 args=0x0 locals=0x60 funcid=0x0 align=0x0
0x0000 00000 (D:\WorkSpace\Code\GoLeran\gin_learn\main.go:5) TEXT main.main(SB), ABIInternal, $96-0
0x0000 00000 (D:\WorkSpace\Code\GoLeran\gin_learn\main.go:5) CMPQ SP, 16(R14)
...
提交错误
基本使用:go bug
使用该命令时会自动跳转到Github的issue页面,并会自动附带上控制台的输出。
文档
基本用法:
Usage of [go] doc:
go doc
go doc <pkg>
go doc <sym>[.<methodOrField>]
go doc [<pkg>.]<sym>[.<methodOrField>]
go doc [<pkg>.][<sym>.]<methodOrField>
go doc <pkg> <sym>[.<methodOrField>]
输出注释文档
示例
直接输出包文档,包文档指的是package
关键字上面的注释
go doc
指定包
go doc foo
指定函数
go doc template.new
指定方法
go doc json.Number.Int64
Embed
基本用法:
//go:embed static
var content []byte
embed
是用于解决编译时将静态文件打包入二进制执行程序内部的问题,有一些静态文件在运行期间是不可能会改变的,可以在打包时将其嵌入二进制程序内部。在使用时有几个需要注意的点:
- 注释的变量类型仅支持三种
string
,[]byte
,embed.FS
,即便是别名也不允许,并且只能声明不能初始化。 - 注释时与
//
不能有空格间隔,否则会被当作普通注释。 - 路径只能书写相对路径,路径中不能以
.
或/
开头,匹配多个路径时要使用path.Match
风格的模式匹配。
以下是几种符合规划的例子
//go:embed README.txt
var ReadMe string // 字符串
//go:embed README.txt
var ReadMeBytes []byte // 字节切片
//go:embed static
var StaticDir embed.FS // 如果想要嵌入多个文件或者目录必须使用embed.FS
//go:embed static template
//go:embed web/index.html
var ResourceDir embed.FS
示例
假设有如下文件结构
test/
|
|--defaultConfig.yml
在开发时经常会遇到默认配置的情况,一般来说如果初始化时没有配置文件,就应该自动生成一个,所以选择将默认配置文件嵌入二进制程序。
package embed_test
import (
"bytes"
"embed"
"fmt"
"io"
"os"
"testing"
)
//go:embed defaultConfig.yml
var defaultConfigString string
func TestEmbedString(t *testing.T) {
dist, err := os.Create("./config.yml")
fmt.Println(err)
io.Copy(dist, bytes.NewBufferString(defaultConfigString))
}
//go:embed defaultConfig.yml
var defaultConfigBytes []byte
func TestEmbedBytes(t *testing.T) {
dist, err := os.Create("./config.yml")
fmt.Println(err)
io.Copy(dist, bytes.NewReader(defaultConfigBytes))
}
//go:embed defaultConfig.yml
var defaultConfigFS embed.FS
func TestEmbedFS(t *testing.T) {
dist, err := os.Create("./config.yml")
fmt.Println(err)
file, err := defaultConfigFS.Open("defaultConfig.yml")
fmt.Println(err)
io.Copy(dist, file)
}