Go笔记 - 环境搭建与命令解析

209 阅读8分钟

运行环境

  • window
  • linux
  • freeBSD
  • darwin

环境变量

  • GOROOT: 根目录
  • GOPATH: 工作目录
  • GOBIN: 可执行文件目录

添加环境变量

  • vim /etc/profile
  • export PATH=$PATH:/usr/local/go/bin
  • export GOPATH=/home/go/workspace

源码组织方式

  • 代码包为基本组织单位
  • 一个代码包中包含任意个源码文件
  • 源码文件需要声明属于同一个代码包
  • 代码包的名称一般与源码文件所在目录同名

构建与安装

  • go build: 构建命令
  • go install: 安装命令
  • go help xxx : 查看帮助
  • go get xxx : 获取代码包
  • 归档文件(*.a)放到pkg目录
  • 可执行文件放到bin目录

go bulid

  • -a : 强制编译所有关联的软件包
  • -i : 编译安装归档文件
  • -x : 输出详细信息
  • -n : 仅查看会执行哪些操作,不会执行编译
  • -v : 输出编译的代码包的名称
  • -o : 自定义可执行文件名称
  • -p n : 指定编译过程中执行各任务的并行数量
  • -race : 开启竞态条件检测
  • -work : 打印出编译时生成的临时工作目录路径,并在编译结束后保留
  • -asmflags : 控制编译器的行为
  • -bulidmode : 指定编译模式
  • -compiler : 指定当前使用的编译器的名称, gc/gccgo
  • -gccgoflags : 指定传递给gccgo编译器或链接器的标记列表
  • -gcflags : 指定传递给go tool compile命令的标记列表
  • -installsuffix : 使当前的输出目录与默认的编译输出目录分离
  • -ldflags : 指定需要传递给go tool link命令的标记列表
  • -linkshared : 与-buildmode=shared一起使用,buildmode将归档文件合并到一个动态链接库文件中,linkshared则进行链接操作
  • -pkgdir : 指定一个目录,编译器从该目录加载归档文件,并将生成的归档文件放到该目录
  • -tags : 指定在实际编译期间的编译标签列表
  • -toolexec : 自定义在编译期间使用一些自带工具的方式

go install

  • go install = go build + 结果文件放到指定目录
  • go install 代码包相对路径

go run

  • 编译并运行命令源码文件,可执行文件放在临时工作目录中
  • go run= gobulid + 运行
  • -n : 打印执行的命令不执行
  • -name="xxx": 传入运行参数

go test

  • 以代码包为单位的测试
  • 自动测试指定的代码包
  • 测试源码文件以"_test.go"为后缀
  • -c : 生成可执行文件,但不运行
  • -i : 安装测试需要的依赖包
  • -o : 指定可执行文件的名称

go get

  • -u : 下载并安装,不管是否存在
  • -f : 配合-u选项,忽略已下载代码包的导入路径的检查
  • -v : 打印被构建代码包的名字
  • -x : 打印go get执行过程中使用的所有命令
  • -d : 仅下载代码包
  • -fix : 先运行代码版本修正工具,再安装代码包
  • -t : 下载并测试代码包
  • -insecure : 允许通过非安全网络协议下载
  • etc : go get -d github.com/json-iterator/go

go clean

  • 同名的可执行文件
  • 临时文件
  • go test生成的.test后缀的文件
  • -i : 同时删除安装当前代码包所产生的结果文件
  • -r : 递归对依赖包执行go clean命令
  • -n : 打印会执行的命令,但不会执行
  • -x : 打印执行的命令,并执行

go doc

  • 打印程序实体上的文档
  • 程序实体: 变量,常量,函数,结构体和接口
  • -c : 区分大小写
  • -cmd : 同时打印出main包中的可导出的程序实体文档
  • -u : 同时打印出不可导的程序实体的文档
  • etc : go doc fmt
  • etc : go doc http.Request
  • etc : go doc net/http Request

godoc

godoc -http=:6060 通过localhost:6060访问帮助文档 -index : 标记开启搜索索引 -maxresults : 全文搜索结果条目的最大显示数量


go list

  • 列出指定的代码包信息
  • -e : 以容错模式加载和分析指定代码包
  • -json : 以json格式打印出信息
  • -f : 查看指定字段 etc : go list -f {{.ImportPath}} fmt

go fmt

  • 按代码规范格式化源码文件,底层调用gofmt etc : go fmt ./
  • -n : 打印操作,不执行

gofmt

  • 按代码规范格式化源码文件
  • cpuprofile : 把cpu概要文件写入指定文件
  • -d : 显示格式化前后的不同,而不执行式化操作
  • -e : 报告目标源码文件的所有错误
  • -l : 把不符合格式化规范的源码文件的绝对路径打印出来
  • -r : 添加自定义的格式化规则
  • -s : 简化文件中的代码
  • -w : 把改写后的文件写入文件中,而不是打印出来
  • 格式化内容:
    • 按字典顺序排序依赖包导入代码块
    • 缩进,空行和换行
    • 对代码语法的小修正
  • -r:
    • 程序实体名称替换; -r=array1->array2
    • 程序实体类型的替换; -r=interface{}->int
    • 多余圆括号的清除; -r=(x)->x
    • 数值操作的替换; -r=x+x->x*2
    • 基于参数列表的函数调用替换; -r='func(a)->func(a, c)'
  • -s:
    • 消除在数组/切片初始化中不必要的类型声明
    • 消除在字典初始化中不必的类型声明
    • 消除在数组/切片操作时不必要的索引指定
    • 消除迭代时不必要的临时变量赋值操作
功能 go fmt命令 gofmt命
格式化代码 yes yes
列出不规范的源码文件 yes yes
自动改写源码文件 yes yes
显示对比信息 no yes
提示全部错误 no yes
简化代码 no yes
自定义替换/重构辅助 no yes
cpu概要记录 no yes

go fix

  • 将指定代码包中旧版本代码修正为新版本的代码
  • 旧程序调用->新程序调用
  • 旧语法->新语法

go tool fix

go fix 的底层调用

  • -diff : 不将修正后的内容写入文件,打印修正前后的对比信息到标准输出
  • -r : 对目标源码文件做有限的修正操作
  • -force : 强行执行修正操作
  • -? : 查看帮助

go vet

  • 用于检查源码中静态错误
  • -n : 打印操作不执行
  • -x : 打印操作并执行

go tool vet

  • go vet 的底层调用
  • -all : 全部检查
  • -asmdecl : 对汇编语言的源码文件进行检查
  • -assign : 检查赋值语句
  • -atomic : 检查代码包sync/atomic的使用方式
  • -buildtags : 检查编译标签的有效性
  • -composites : 检查复合结构实例的初始化代码
  • -compositeWhiteList : 是否使用复合结构检查的白名单
  • -methods : 检查那些拥有标准命名方法的签名
  • -printf : 检查代码中对打印函数的使用是否正确
  • -printffuncs : 检查代码中使用的打印函数的名称列表
  • -rangeloops : 检查range语句块迭代变量是否使用正确
  • -structtags : 检查结构体类型字段标签格式
  • -unreachable : 检查并报告不可达代码

go tool pprof

  • 交互式的访问概要文件
  • 概要文件:
    • runtime和runtime/pprof代码包生成
    • 类别: cpu概要文件,内存概要文件和程序阻塞概要文件
  • cpu概要文件:
    • 默认100Hz的采样频率
    • 对当前goroutine堆栈上的程序计数器取样
  • 内存概要文件:
    • 保存程序执行期间内存使用情况
    • 默认取样间隔512kB
  • 程序阻塞概要文件:
    • 保存程序阻塞事件的记录
    • 默认的取样间隔为1次

go tool cgo

  • 创建能够调用C语言的源码文件
名称 默认值 说明
-cdefs false 将改写后的源码内容以C定义模式打印到标准输出,而不生成相关的源码文件。
-godefs false 将改写后的源码内容以Go定义模式打印到标准输出,而不生成相关的源码文件。
-objdir "" gcc编译的目标文件所在的路径。若未自定义则为当前目录下的_obj子目录。
-dynimport "" 如果值不为空字符串,则打印为其值所代表的文件生成的动态导入数据到标准输出。
-dynlinker false 记录在dynimport模式下的动态链接器信息。
-dynout "" 将-dynimport的输出(如果有的话)写入到其值所代表的文件中。
-gccgo false 生成可供gccgo编译器使用的文件。
-gccgopkgpath "" 对应于gccgo编译器的-fgo-pkgpath选项。
-gccgoprefix "" 对应于gccgo编译器的-fgo-prefix选项。
-debug-define false 打印相关的指令符#defines及其后续内容到标准输出。
-debug-gcc false 打印gcc调用信息到标准输出。
-import_runtime_cgo true 在生成的代码中加入语句“import runtime/cgo”。
-import_syscall true 在生成的代码中加入语句“import syscall”。

go env

  • 打印环境信息
名称 说明
CGO_ENABLED 指明cgo工具是否可用的标识。
GOARCH 程序构建环境的目标计算架构。
GOBIN 存放可执行文件的目录的绝对路径。
GOCHAR 程序构建环境的目标计算架构的单字符标识。
GOEXE 可执行文件的后缀。
GOHOSTARCH 程序运行环境的目标计算架构。
GOOS 程序构建环境的目标操作系统。
GOHOSTOS 程序运行环境的目标操作系统。
GOPATH 工作区目录的绝对路径。
GORACE 用于数据竞争检测的相关选项。
GOROOT Go语言的安装目录的绝对路径。
GOTOOLDIR Go工具目录的绝对路径。

参考