go命令补遗
Posted embedded-linux
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go命令补遗相关的知识,希望对你有一定的参考价值。
可通过go help获取go命令,如下记录一些易忽略的go命令用法。
Go is a tool for managing Go source code. Usage: go <command> [arguments] The commands are: bug start a bug report build compile packages and dependencies clean remove object files and cached files 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 add dependencies to current module and install them install compile and install packages and dependencies list list packages or modules mod module maintenance run compile and run Go program test test packages tool run specified go tool version print Go version vet report likely mistakes in packages Use "go help <command>" for more information about a command. Additional help topics: buildmode build modes c calling between Go and C cache build and test caching environment environment variables filetype file types go.mod the go.mod file gopath GOPATH environment variable gopath-get legacy GOPATH go get goproxy module proxy protocol importpath import path syntax modules modules, module versions, and more module-get module-aware go get module-auth module authentication using go.sum module-private module configuration for non-public modules packages package lists and patterns testflag testing flags testfunc testing functions Use "go help <topic>" for more information about that topic.
1. go build
缩小输出文件体积
go 编译出的文件,体积挺大的。一个重要原因是其中包含了调试信息,可以通过编译参数使其不包含调试信息。
# 移除 调试信息(-w) 和 符号表(-s) go build -o main -ldflags "-w -s" main.go
上述操作使用 -ldflags
参数指定 -w
和 -s
, 分别表示在编译时不包含调试信息和符号表,此举可以较好地缩减二进制文件体积。
编译时写入全局变量
go 可以通过编译参数,在编译时对变量进行赋值。一般情况下,这种操作可以让程序保留编译信息等数据。
通过 -ldflags
参数,设定 -X
操作,可以为全局变量赋值(一定要加-X)。
go build -ldflags "-X ‘main.BuildTime=time006‘" main.go go build -ldflags "-X ‘main.BuildTime=`date`‘ -X ‘main.GitHash=`git rev-parse HEAD`‘" main.go go build -ldflags "-X cnca.HTTP2ClientTLSCAPath=/etc/openness/certs/ngc" -o "kubectl-cnca"
2. go fmt
统一的代码格式化工具
3. goimports
自动import依赖包工具
4. go vet
内置错误检查工具
5. golint
代码检测工具
6. golangci-lint
静态代码质量检测工具,用于包的质量分析。go代码检查聚合工具,可定制。
代码检查应用
细看Kubernetes库,会发现,其会针对每个PR都做如下静态检查:
- gofmt: https://github.com/kubernetes/kubernetes/blob/master/hack/verify-gofmt.sh
- govet: https://github.com/kubernetes/kubernetes/blob/master/hack/make-rules/vet.sh
- golint: https://github.com/kubernetes/kubernetes/blob/master/hack/verify-golint.sh
因为golint只是纠正代码风格,并不是强制,所以k8s官方就弄了比较软的方案,对于当前已经存在的代码如果有问题,先排除掉(如下)。对于新生代码,如果检查失败,ci就挂掉。
https://github.com/kubernetes/kubernetes/blob/master/hack/.golint_failures
Kubernetes只利用了官方的几款工具, 在检测准确性上比较有保障。有了这些检查点,也能倒逼研发人员关注提交代码的质量,会迫使其在本地或者IDE上就配置好检查,确保每次提交的PR都能通过检查,不浪费CI资源。这也是合格工程师的基本要求。
参考:
3. 在 GitHub 上构建一个看上去正规的 Golang 项目
以上是关于go命令补遗的主要内容,如果未能解决你的问题,请参考以下文章
解决go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘(代码片段
[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础
转-Spring 注解学习手札 补遗——@ResponseBody,@RequestBody,@PathVariable