Go实战之常用命令行工具(上)

简介: Go实战之常用命令行工具

Golang具有一套可以构建和处理go源代码的程序,作为命令行工具,这些程序也并非直接运行,而是由go程序调用。运行这些程序最常见的方式是作为go程序的子命令,例如 go fmt,该命令的运行方式是由go程序使用适合于包级处理的参数调用底层二进制文件,对go源代码的完整包进行操作;这些程序也可以作为独立的二进制文件运行,使用go tool子命令(如go tool cgo)使用未修改的参数;某些命令(如pprof)只能通过go tool子命令访问。go命令行作为日常开发的工具,能大大方便编译、调试、诊断程序性能等工作,本文是对常见go命令行工具使用的汇总

1 go命令

go命令管理go源代码并运行此处列出的其他命令。在终端输入go,会打印出如下信息

8.png

常用命令详解

启动错误报告 运行go bug命令,Bug打开默认浏览器并启动新的Bug报告,报告包括有用的系统信息

编译包和依赖项

编译go文件

build       compile packages and dependencies
go build [-o output] [-i] [build flags] [packages]
# 跨平台编译 
env GOOS=linux GOARCH=amd64 go build

build编译由导入路径命名的包及其依赖项,但不安装编译结果。如果build的参数是来自单个目录的.go文件列表,则build会将它们视为指定单个包的源文件列表;编译包时,build将忽略以"_test.go"结尾的文件


在编译单个main包时,build将生成的可执行文件写入以第一个源文件(go build ed.go rx.go 输出的二进制文件名为 ‘ed’ 或 ‘ed.exe’)或源代码目录(go build unix/sam 输出的二进制文件名为 ‘sam’ 或 ‘sam.exe’)命名的输出文件(写入Windows可执行文件时会添加.exe后缀);编译多个包或单个非main包时,build会编译包,但会丢弃生成的对象,仅用于检查包是否可编译

image.png

删除对象文件和缓存文件 用法如下

go clean [clean flags] [build flags] [packages]

clean从包源目录中删除对象文件。go命令在一个临时目录中构建大多数对象,因此go clean主要关注其他go工具或通过手动调用go build留下的对象文件

image.png

go clean

展示包或符号的文档 用法

go doc [-u] [-c] [package|[package.]symbol[.methodOrField]]
go doc <pkg>
go doc <sym>[.<methodOrField>]
go doc [<pkg>.]<sym>[.<methodOrField>]
go doc [<pkg>.][<sym>.]<methodOrField>
// 在所有形式中,当匹配符号时,参数中的小写字母与任意一个大写字母都匹配,
// 但大写字母完全匹配。这意味着,如果不同的符号有不同的大小写,则包中的小写参数可能有多个匹配项。如果出现这种情况,则打印所有匹配的文档
## 例子
go doc  展示当前包的文档
go doc Foo  展示当前包中Foo的文档(Foo为首字母大写,因此不会匹配包路径)
go doc encoding/json  展示encoding/json包文档
go doc json  encoding/json缩写形式
go doc json.Number (或 go doc json.number) 展示json.Number的文档和方法摘要
go doc json.Number.Int64 (或 go doc json.number.int64)  展示json.Number中Int64方法的文档
go doc cmd/doc  显示doc命名的包文档
go doc -cmd cmd/doc  在doc命令中显示包文档和导出的符号
go doc template.new  展示html/template中New函数的文档
go doc text/template.new  一个参数,展示text/template中New函数的文档
go doc text/template new 两个参数,展示text/template中New函数的文档

image.png

go doc

打印go环境信息 用法

go env [-json] [-u] [-w] [var ...]

默认情况下,env将信息打印为shell脚本(在windows上,是批处理文件)。如果一个或多个变量名作为参数给定,env将在其自己的行上打印每个命名变量的值

image.png

go env

更新包以使用新的APIs 使用方法

go fix [packages]

fix对由导入路径命名的包运行go fix命令。fix查找使用旧api的go程序,并重写它们以使用新的api; 更新到新的go版本后,fix将帮助您对程序进行必要的更改。使用

go tool fix [-r name,...] [path ...]

如果没有显式路径,fix将读取标准输入并将结果写入标准输出; 如果命名路径是一个文件,fix会就地重写命名文件; 如果命名路径是一个目录,fix重写该目录中的所有.go文件树


gofmt(重新格式化)源码包

类似于C中的lint, 统一代码风格和排版

常用命令如: go fmt

fmt gofmt (reformat) package sources
go fmt [-n] [-x] [packages]

fmt在由导入路径命名的包上运行命令go fmt -l -w,它打印被修改文件的名称

-n标志打印将要执行的命令; -x标志在执行命令时打印命令

要了解更多关于gofmt细节可以运行命令go doc cmd/gofmt

通过处理源码生成go文件 使用方法

go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]

生成(必须显示运行)由现有文件中的指令描述的运行命令。这些命令可以运行任何进程,但其意图是创建或更新go源文件。它还接受标准的构建标志,包括-v,-n和-x: -v标志在处理过程中打印包和文件的名称; -n标志打印将要执行的命令; -x标志在执行命令时打印命令

将依赖项添加到当前模块并安装它们

用于获取go的第三方包,通常会默认从git repo上pulI最新的版本

get add dependencies to current module and install them
go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages]

常用命令如: go get -u github.com/go-sql-driver/mysql (从github上获

取mysq|的driver并安装至本地)


get解析并向当前开发模块添加依赖项,然后构建并安装它们


第一步,要解决添加哪些依赖项 对于每个命名的包或包模式,get必须决定使用相应模块的哪个版本。默认情况下,get会查找最新的标记版本,如v0.4.5或v1.2.3; 如果没有标记的发布版本,get将查找最新的标记的预发布版本,如v0.0.1-pre1; 如果根本没有标记的版本,get将查找最新的已知提交。如果在更高版本(例如,比最新版本更新的预发行版)中还不需要该模块,则get将使用它查找的版本。否则,get将使用当前所需的版本


第二步是下载(如果需要)、构建和安装命名包 如果参数命名的是模块而不是包(因为模块的根目录中没有go源代码),则会跳过该参数的安装步骤,而不会导致构建失败

image.png

go get

目录
相关文章
|
3月前
|
消息中间件 人工智能 供应链
go-zero 微服务实战系列(二、服务拆分)
go-zero 微服务实战系列(二、服务拆分)
|
2月前
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
5月前
|
存储 算法 Go
go语言并发实战——日志收集系统(七) etcd的介绍与简单使用
go语言并发实战——日志收集系统(七) etcd的介绍与简单使用
|
2月前
|
安全 大数据 Go
深入探索Go语言并发编程:Goroutines与Channels的实战应用
在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
|
3月前
|
消息中间件 缓存 Kafka
go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
|
3月前
|
缓存 NoSQL Redis
go-zero微服务实战系列(七、请求量这么高该如何优化)
go-zero微服务实战系列(七、请求量这么高该如何优化)
|
3月前
|
缓存 NoSQL 数据库
go-zero微服务实战系列(五、缓存代码怎么写)
go-zero微服务实战系列(五、缓存代码怎么写)
|
3月前
|
API
企业项目迁移go-zero实战(二)
企业项目迁移go-zero实战(二)
|
3月前
|
消息中间件 存储 NoSQL
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
本文档介绍了如何使用 Go 语言中的 `go-redis` 库操作 Redis 数据库
172 0
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
|
3月前
|
消息中间件 SQL 关系型数据库
go-zero微服务实战系列(十、分布式事务如何实现)
go-zero微服务实战系列(十、分布式事务如何实现)