go

直接输入 go 查看所有命令

输入 go help 命令 获得命令详解

go bug

默认打开浏览器跳转到 go在github页面的bug报告

go build

此命令用于编译指定的源码文件或代码包及依赖包

也可以指定输出文件名 go build -o main.exe

若有多个main函数文件 可以在后面加文件名 go build 文件名

若是在普通包下,输入"go build"后不会生成任何文件,只会检查错误

  • -o 指定输出的文件名,可以带上路径,例如 go build -o a/b/c
  • -i 安装相应的包,编译+go install
  • -a 更新全部已经是最新的包的,但是对标准包不适用
  • -n 把需要执行的编译命令打印出来,但是不执行,这样就可以很容易的知道底层是如何运行的
  • -p n 指定可以并行可运行的编译数目,默认是CPU数目
  • -race 开启编译的时候自动检测数据竞争的情况,目前只支持64位的机器
  • -v 打印出来我们正在编译的包名
  • -work 打印出来编译时候的临时文件夹名称,并且如果已经存在的话就不要删除
  • -x 打印出来执行的命令,其实就是和-n的结果类似,只是这个会执行
  • -ccflags 'arg list' 传递参数给5c, 6c, 8c 调用
  • -compiler name 指定相应的编译器,gccgo还是gc
  • -gccgoflags 'arg list' 传递参数给gccgo编译连接调用
  • -gcflags 'arg list' 传递参数给5g, 6g, 8g 调用
  • -installsuffix suffix 为了和默认的安装包区别开来,采用这个前缀来重新安装那些依赖的包,-race的时候默认已经是-installsuffix race,大家可以通过-n命令来验证
  • -ldflags 'flag list' 传递参数给5l, 6l, 8l 调用
  • -tags 'tag list' 设置在编译的时候可以适配的那些tag,详细的tag限制参考里面的 Build Constraints

go install

go install 跟 go build 类似,只是多做了一件事就是安装编译后的文件到指定目录。执行后可执行文件自动安装到bin目录下

  • 错误:“go install: no install location for .go files listed on command line (GOBIN not set)”这是因为没有设置环境变量GOBIN。解决:export GOBIN=$GOPATH/bin
  • go install的参数跟go build一样,这里不再说明

go get

go get命令用于动态获取远程代码包及其依赖包,并进行编译和安装。

执行命令后一般会下载在GOPATH的src目录下。

  • 当想要修改package的版本时,只需要go get package@指定的version即可
  • 无法下载“golang.org”网站内容,这是由于国内网络限制原因,当出现这种情况一般有3种方法解决:1.手动下载2.设置代理3.使用GOPROXY环境变量1.手动下载方式,不推荐,因为可能有太多的依赖(或依赖的依赖)关系。2.设置代理若你有代理,可以使用如下命令 export http_proxy=http://proxyAddress:port
     export https_proxy=http://proxyAddress:port或 export all_proxy=http://proxyAddress:port3.使用GOPROXY环境变量推荐使用这种方法,但前提是Go版本是1.11及以后。所以需要设置GOPROXY环境变量,设置后下载源码将通过这个环境变量设置的代理地址进行下载。goproxy.io这个开源项目帮我们实现了代理功能,并提供了公用的代理服务: https://goproxy.io推荐设置GOPROXY使用公用代理服务https://goproxy.io export GOPROXY=https://goproxy.io由于需要依赖go module功能,所以需要开启MODULE export GO111MODULE=on最后再来执行上面的go get命令: go get github.com/PuerkitoBio/goqueryimg不过这种方法下载的包源码在GOPATH目录下的pkg/mod目录下。若需要关闭GOPROXY环境变量,只需: export GOPROXY=另外,国内开源项目goproxy.cn也提供了类似服务,公用代理服务:https://goproxy.cn
  • go get有一些参数,如下所示:img

go mod

go mod 是 go modules的简写,用于对go包的管理。从go1.11开始实现了modules管理,mod相比以前的方式,优点主要体现在:

  • 项目不需要放在GOPATH下的src目录了,可以在任意目录。
  • 自动下载第三方包和依赖包。
  • 第三方包会指定版本号。
  • 项目内会生成一个go.mod文件,文件内指定包依赖关系。
  • 有一些第三方包不存在了或转移到其他地方,不需要改代码,只需用replace命令替换即可。

要使用modules,前提是需要将环境变量GO111MODULE设为on或者auto:

 GO111MODULE=on
img

GO111MODULE有三个值:

  • GO111MODULE=off : go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
  • GO111MODULE=on :go命令行会使用modules,不会去GOPATH目录下查找。
  • GO111MODULE=auto : 这是默认值,会根据当前目录的位置来决定是否启用modules功能,若项目在GOPATH的src之外且根目录下有go.mod文件时会启用modules。

要先用 go mod init 项目名

go run

go run用于编译并运行源码文件,由于包含编译步骤,所以go build参数都可用于go run,在go run 中只接受go源码文件而不接受代码包。

go clean

go clean命令用于删除执行其他命令时产生的文件或目录,这些文件包括:

  • _obj/ 旧的object目录,由Makefiles遗留
  • _test/ 旧的test目录,由Makefiles遗留
  • _testmain.go 旧的gotest文件,由Makefiles遗留
  • test.out 旧的test记录,由Makefiles遗留
  • build.out 旧的test记录,由Makefiles遗留
  • *.[568ao] object文件,由Makefiles遗留
  • DIR(.exe) 由go build产生
  • DIR.test(.exe) 由go test -c产生
  • MAINFILE(.exe) 由go build MAINFILE.go产生
  • *.so 由 SWIG 产生
  • -i 清除关联的安装的包和可运行文件,也就是通过go install安装的文件
  • -n 把需要执行的清除命令打印出来,但是不执行,这样就可以很容易的知道底层是如何运行的
  • -r 循环的清除在import中引入的包
  • -x 打印出来执行的详细命令,其实就是-n打印的执行版本

一般使用go clean命令清理干净后上传到代码托管。

执行go clean -i -n 进行清理(根据go版本不同,可能需要mod支持)

go clean -i -n

go fmt

go fmt用于检查并格式化成go语言的规范格式。

我们知道,在go语言中有严格的代码规范,否则编译不通过。不过大部分编译器已经自动实现规范格式,但此命名还是非常有用的。

  • -l 显示那些需要格式化的文件
  • -w 把改写后的内容直接写入到文件中,而不是作为结果打印到标准输出。
  • -r 添加形如“a[b:len(a)] -> a[b:]”的重写规则,方便我们做批量替换
  • -s 简化文件中的代码
  • -d 显示格式化前后的diff而不是写入文件,默认是false
  • -e 打印所有的语法错误到标准输出。如果不使用此标记,则只会打印不同行的前10个错误。
  • -cpuprofile 支持调试模式,写入相应的cpufile到指定的文件

使用


import (
"fmt"
)

func main() {
fmt.Println("Zarten")
fmt.Println("Zarten")

}zarten2.gopackage main

import (
"fmt"
)

func main() {
fmt.Println("Zarten2")



fmt.Println("Zarten2")
}
  • go fmt可以格式化整个项目或某个go文件,一般使用gofmt工具。例如在my目录下有2个不规范文件:zarten.go 和 zarten2.gozarten.gopackage main

    显示项目内需要格式的文件:gofmt -l my
    img
    加上参数-w,自动写入文件中:gofmt -l -w my
    img
    查看文件发现,格式已经改写成规范格式了。
  • 同时gofmt也可对单个文件使用,例如zarten.gogofmt zarten.go将规范化的代码打印出来,但没有将规范化写入文件中
    img
    要将写入文件中需要加"-w"参数:gofmt -w zarten.go

go list

go list 会列出当前安装的包

go version

go version 可以查看当前go的版本

go env

go env 可以查看当前go的环境变量

交叉编译各大平台命令

有时我们需要在某一平台编译出其他平台的可执行文件,go语言也提供了相关的命令或配置

在Mac平台编译

  • Linux
CGO_ENABLED=0  GOOS=linux  GOARCH=amd64  go build main.go
  • Windows
CGO_ENABLED=0 GOOS=windows  GOARCH=amd64  go  build  main.go

在Linux平台编译

  • Mac
CGO_ENABLED=0 GOOS=darwin  GOARCH=amd64  go build main.go
  • Windows
CGO_ENABLED=0 GOOS=windows  GOARCH=amd64  go build main.go

在Windows平台编译

  • Mac
SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go

或写成批处理

SET  CGO_ENABLED=0<br>SET GOOS=darwin<br>SET GOARCH=amd64<br>go build main.go
  • Linux
SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build main.go

或写成批处理

SET CGO_ENABLED=0<br>SET GOOS=linux<br>SET GOARCH=amd64<br>go build main.go

在Goland中的设置交叉编译

例如编译在linux下的程序设置:

GOARCH=amd64;GOOS=linux
img

总结

善用 “go help 命令”。

© 版权声明
箴言区 抢沙发
头像
达瓦里希请发言...
提交
头像

昵称

取消
昵称表情代码图片