以下是开发过程会涉及的常用命令。

go run

编译生成临时可执行文件,程序结束后删除。适合用于小程序的调试,或者把 Go 当成脚本语言来用的场景。

go build
-o
go install

Go 程序除了可通过预先编译成可执行文件进行分发外,常用的工具包等三方依赖,通常以源码的形式进行分发。

go install@
@latest

示例:

$ go install github.com/foo/bar@latest

该命令实际上包含了如下过程:

$GOPATH/bin

而更新操作也是一样的,重新执行一次安装即可。

代码格式化

go fmt
$ go fmt path/to/your/package

同时也提供了一个增强工具 goimports 用于格式化 import 导入。

安装:

$ go install golang.org/x/tools/cmd/goimports@latest

使用:

$ goimports -l -w .

代码风格检查

golint
$ go install golang.org/x/lint/golint@latest
main.go
package main

import (
	"fmt"
)

func main() {
	a := 1
	fmt.Println("hello world!")
}

使用:

# Lint 整个项目
$ golint ./…
golint-min_confidence 0
$ golint -min_confidence 0 ./...
main.go:1:1: should have a package comment, unless it's in another file for this package
go vet
$ go vet ./…
vet: ./main.go:8:1: a declared but not used
golintgo vet
$ golangci-lint run

Makefile

make

一个简单的示例:

# makefile
.DEFAULT_GOAL:= build

fmt:
	go fmt ./...
.PHONY:fmt

lint:
	golint ./..
.PHONY:lint

vet:fmt
	go vet ./...
.PHONY:vet

build:vet
	go build main.go
.PHONY:build

如果你已经熟悉 makefile,上面代码不言自明。

make
.DEFAULT_GOAL

冒号后面是该任务的依赖,表示需要依赖先执行完才行。

紧跟任务的行定义该任务具体要执行的命令。

.PHONY
make
$ make
go fmt ./...
go vet ./...
# example.com/hello
vet: ./main.go:8:2: a declared but not used
make: *** [vet] Error 2

Go 版本更新

Go 编译后的程序不依赖运行时,所以不受 Go 版本的影响。但源码的编译是和版本有关的。

一般情况下,不会有向后兼容性问题,但升级正确的做法,还是先安装新版,在新版下验证程序后再正式将 Go 的版本切换到新版。

1.16.11.16.5
$ go et golang.org/dl/go.1.16.5
$ go1.16.5 download

然后使用新版编译程序进行验证:

$ go1.16.5 build

验证通过后即可将新版的环境变量删除,

$ go1.16.5 env GOROOT
/Users/gobook/sdk/go1.16.5
$ rm -rf $(go1.16.5 env GOROOT)
$ rm $(go env GOPATH)/bin/go1.16.5

然后安装最新 Go 版本即可。如果之前通过 Homebrew 安装,则仍然使用它升级即可。