over-golang/03-工程管理/04-Go常用命令.md

98 lines
4.1 KiB
Go
Raw Permalink Normal View History

2021-07-02 18:11:59 +08:00
## 常用Go命令
#### 1.1 常用命令汇总
- `go version` 获取Go版本
- `go help` 查看Go帮助命令
- `go get` 获取远程包需提前安装`git``hg`
- `go build` 编译并生成可执行程序
- `go run` 直接运行程序
- `go fmt` 格式化源码
- `go install` 编译包文件以及整个程序
- `go test` go原生提供的单元测试命令
- `go clean` 移除当前源码包和关联源码包里编译生成的文件
- `go tool` 升级Go版本时修复旧版代码
- `godoc -http:80`开启一个本地80端口的web文档
- `gdb 可执行程序名`调试Go编译出来的文件
#### 1.2 go fmt
`go fmt`命令可以格式化代码文件
```
# 命令格式使用go fmt命令其实是调用了gofmt而且需要参数-w否则格式化结果不会写入文件
go fmt -w 文件名.go
# 示例格式化整个项目
gofmt -w -l src
```
常见参数
- `-l` 显示那些需要格式化的文件
- `-w` 把改写后的内容直接写入到文件中而不是作为结果打印到标准输出
- `-r` 添加形如"a[b:len(a)] -> a[b:]"的重写规则方便我们做批量替换
- `-s` 简化文件中的代码
- `-d` 显示格式化前后的diff而不是写入文件默认是false
- `-e` 打印语法错误到标准输出无此参数只会打印不同行的前10个错误
#### 1.3 go install
`go install`命令用来生成项目的可执行文件进入对应的go文件所在的目录执行命令可以直接生成一个可执行文件在bin目录如图
![](../images/go/lang-02.png)
贴士
- 添加参数`-v`可以查看该命令底层执行信息
- 如果`main.go`中引入并使用了`expl`则该包的内容也被会安装进bin目录中
- go文件中如果没有`main`函数无法执行这样的文件称之为应用包会被编译为`.a`文件并生成在pkg文件夹中
注意
没有开启`go mod`使用上述命令需要配置`GOPATH`否则会报`no install location`
#### 1.4 go tool
go tool下聚集了很多命令主要有2个即fix和vet
- `go tool fix .`用来修复以前老版本的代码到新版本
- `go tool vet directory|files`分析当前目录的代码是否正确
#### 1.5 go get
`go get`用来获取远程仓库中的包使用该命令前必须配置GOPATH,而且依据不同的源码网站还要安装不同的版本管理工具比如从github上使用`go get`需要额外安装git
示例
```
# 下载包添加 -u 参数可以自动更新包和依赖
go get github.com/**/**
# 使用包与普通包使用方式一致
import "github.com/****/****"
```
`go get`本质上可以理解为通过源码工具clone下代码后执行了`go install`
由于一些原因有的包无法下载如包`"golang.org/x/sync/syncmap"`可以在src目录下执行下面的操作
```
mkdir -p golang.org/x/
cd golang.org/x/
git clone https://github.com/golang/sync.git
```
#### 1.6 go build
`go build`用于编译代码在编译过程中会同时编译与之相关联的包
- 如果是main包执行`go build`之后会在当前目录下生成一个可执行文件如果你需要在$GOPATH/bin下生成相应的文件需要执行`go install`或者使用`go build -o 路径/a.exe`
- 如果是普通包执行go build之后它不会产生任何文件
- 该命令默认会编译当前目录下的所有go文件如果只想编译某个文件可使用`go build exp.go`
- `go build`会忽略目录下以`_``.`开头的go文件
如果go build报错
```
/usr/lib/go-1.10/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/tmp/go-link-008006128/000026.o: In function _cgo_05dc84caff82_Cfunc_sysconf': /tmp/go-build/cgo-gcc-prolog:32: multiple definition of_cgo_05dc84caff82_Cfunc_sysconf
/tmp/go-link-008006128/000024.o:/tmp/go-build/cgo-gcc-prolog:32: first defined here
collect2: error: ld returned 1 exit status
```
则解决方案是
```
linux: export CGO_ENABLED=0
windows : cmd: set CGO_ENABLED=0
windows powershell:$env:CGO_ENABLED=0
```