Go 工具
概述
参考:
go 是用来管理 Go 编程语言源代码的工具
go
参考:
go 是一个工具,用来管理 Go 语言编写的代码。该工具由多个子命令组成。每个子命令可以实现不同类型的功能。
bug - start a bug report
build - 编译 package 及其依赖
https://pkg.go.dev/cmd/go#hdr-Compile_packages_and_dependencies
默认编译当前路径下的代码包及其依赖,生成一个可执行文件
OPTIONS
- -ldflags [PATTERN=]ARG # 向链接器传递一些参数。这些参数可用于指定编译时需要使用的一些信息,例如项目版本号、Git 提交 ID、构建时间、构建平台和架构等元数据信息
- 比如:
-ldflags "-X 'main.version=1.0.0' -X 'main.buildTime=$(date)'"# 为 main 包中的 version 和 buildTime 变量设置值-ldflags "-s -w"# 告诉链接器在生成可执行文件时忽略调试信息和符号表,从而使得你的二进制文件更加紧凑而且不再可读。
- 比如:
- -gcflags [PATTERN=]ARG # 每次执行"go tool compile"时要传递的参数。
- -o NAME # 指定构建完成后生成的文件名为 NAME
- -x # 输出 Go 程序编译、链接、打包的全过程。包括都使用了哪些库、执行了什么命令、等等
EXAMPLE
- 指定构建名称
- go build -o jhs_cli cmd/jhs_cli/main.go
比如下面的构建脚本
#!/bin/bash
#
# 参考: https://github.com/alist-org/alist/blob/main/build.sh
# 执行: `bash build.sh bin/net_tool` 构建程序
builtAt="$(date +'%F %T %z')"
goVersion=$(go version | sed 's/go version //')
gitAuthor="DesistDaydream"
gitCommit=$(git log --pretty=format:"%h" -1)
version=$(git describe --abbrev=0 --tags)
ldflags="\
-w -s \
-X 'github.com/DesistDaydream/net_tool/internal/conf.BuiltAt=$builtAt' \
-X 'github.com/DesistDaydream/net_tool/internal/conf.GoVersion=$goVersion' \
-X 'github.com/DesistDaydream/net_tool/internal/conf.GitAuthor=$gitAuthor' \
-X 'github.com/DesistDaydream/net_tool/internal/conf.GitCommit=$gitCommit' \
-X 'github.com/DesistDaydream/net_tool/internal/conf.Version=$version' \
"
go build -o "$1" -ldflags="$ldflags" -tags=jsoniter .
相当于为 github.com/DesistDaydream/net_tool 项目中的 internal/conf/ 目录(i.e. 该项目中的 conf 这个 packet)下的 BuiltAt、GoVersion、etc. 变量赋予了指定的值,这些变量可以通过 version 相关的子命令或命令行参数显示出来。
package conf
var (
BuiltAt string
GoVersion string
GitAuthor string
GitCommit string
Version string = "dev"
WebVersion string
)
clean - remove object files and cached files
EXAMPLE
- go clean -i github.com/spf13/cobra/cobra #
doc show documentation for package or symbol
env print Go environment information
fix update packages to use new APIs
fmt gofmt (reformat) package sources
generate generate Go files by processing source
get - 下载并安装 package 及其依赖
OPTIONS
- -u # 更新现有依赖,强制更新它所依赖的其他全部模块,不包括自身
- -t # 更新所有直接依赖和间接依赖的模块版本,包括单元测试中用到的。
install compile and install packages and dependencies
list list packages or modules
mod - go 模块维护与管理命令
详见《Go Module》章节
run - 编译并运行 Go 程序
test - test packages
详见 《Go 单元测试》 章节
tool - run specified go tool
vet - report likely mistakes in packages
其他工具
很多 Go 语言生态的工具为我们编写代码提供了强大的支持,这些工具通常会作为 IDE 的插件被安装
比如 VSCode 中,当我们安装完 Go 的所有工具后,右键点击代码会出现如下提示:

通过这些工具,我们可以
- 检查代码问题
- 自动创建测试代码
- 自动格式化代码
- 等等
gopls
参考:
gopls 是一个用以实现 LSP 的官方工具。
gotests
参考:
gotests 工具可以让我们更容易得编写 Go 单元测试。该工具可以根据目标源文件的 函数 和 方法 自动生成测试用例。测试文件中的任何新依赖项都会自动导入。
gotests 可以作为 IDE 的插件提供更方便的使用,下面是一个 Sublime Text3 插件的示例

在 Emacs, also Emacs, Vim, Atom Editor, Visual Studio Code, and IntelliJ Goland 等 IDE 中也有这个插件。当然,如果不想在 IDE 中使用,也可以在命令行直接使用 gotests。、、、、、、
简单示例
假如有一个文件 unit_tests.go 如下代码:
func UnitTests(needArgs string) bool {
if needArgs == "unittests" {
return true
} else {
return false
}
}
gotests 将会创建一个 unit_tests_test.go 文件,并为 UnitTests() 函数生成测试用例:
func TestUnitTests(t *testing.T) {
// 这是是测试时需要传递给 UnitTests() 的参数
type args struct {
needArgs string
}
// 可以创建多个测试
tests := []struct {
// 测试名称
name string
// 需要传递给 UnitTests() 的参数
args args
// 需要判断 UnitTests() 的返回值
want bool
}{
// TODO: 在这里写具体的测试用例,也就是执行 UnitTests() 时想要传递的参数和想要获取到的返回值
// 这是一个 struct 类型的数组,注意书写格式。
{
name: "这是第一条测试在下面填写测试想要传递的参数以及想要获取到的返回值",
args: args{"unittests"},
want: true,
},
{
name: "这里是第二条测试用例中需要用到的信息",
args: args{"这里的参数会导致返回值为 false,进而会导致本次测试失败"},
want: true,
},
}
// 执行我们提供的每一条测试用例
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := UnitTests(tt.args.needArgs); got != tt.want {
// 如果 UnitTests() 的返回值与我们填写的 want(即想要获得的返回值) 不一致,那么将会报错
t.Errorf("UnitTests() = %v, want %v", got, tt.want)
}
})
}
}
执行测试后效果如下:

Syntax(语法)
gotests [OPTIONS] PATH…
dlv
参考:
Delve 是 Go 编程语言的调试器。该项目的目标是为 Go 提供一个简单、功能齐全的调试工具。 Delve 应该易于调用和使用。如果您使用的是调试器,那么事情可能不会如您所愿。考虑到这一点,Delve 应该尽可能地远离你。
impl
参考:
impl 用于生成实现接口的 [Method stub](</docs/2.编程/Programming(编程)/Programming(编程).md»)
简单示例
通过 Go: Generate Interface Stubs 可以快速生成某个接口下的方法

语法:VAR *STRUCT INTERFACE
- VAR 是方法的接收者的变量
- STRUCT 是方法的接收者,也就是某个类型
- INTERFACE 是想要让 STRUCT 实现的接口名称。名称由
包名.接口名组合合成
e.g. 想让 File 结构体实现 io.Closer 接口,则输入:f *File io.Closer,将会生成如下方法:
func (f *File) Close() error {
panic("not implemented") // TODO: Implement
}
也可以通过命令行,使用
impl 'f *File' io.Closer命令生成方法。
若提示 Cannot stub interface: unrecognized interface: handler.YuqeData导致无法生成方法,则对接口使用一下 Find All Implementations

gomodifytags
参考:
staticcheck
参考:
Staticcheck 是一个高级 Go Linter,即用于 Go 的代码检查工具,使用静态分析,可以发现错误和性能问题,提供简化,并强制执行样式规则
goplay
参考:
goplay 可以让代码通过 https://play.golang.org/ 打开(这是一个在线运行 Go 代码的网站)。
反馈
此页是否对你有帮助?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.