Go 常用命令介绍

Go 常用命令

文章目录

  • Go 常用命令
    • 一、Go 常用命令
      • 1.1 go build
        • 1.1.1 指定输出目录
        • 1.1.2 常用环境变量设置编译操作系统和 CPU 架构
        • 1.1.3 查看支持的操作系统和CPU架构
      • 1.2 go test
      • 1.3 go vet
      • 1.4 go clean
      • 1.5 go fmt
      • 1.6 go get
      • 1.7 go install
      • 1.8 go tool
      • 1.9 go generate
      • 1.10 godoc
      • 1.11 go run

一、Go 常用命令

以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和管理依赖项等任务。

命令描述
go bug启动一个用于报告bug的工具。
go build编译Go程序包及其依赖项。
go clean删除编译生成的对象文件和缓存文件。
go doc显示有关包或符号的文档。
go env打印有关Go环境的信息。
go fix更新包以使用新的API。
go fmt使用gofmt重新格式化Go包的源代码。
go generate通过处理源代码来生成Go文件。
go get将依赖项添加到当前模块并安装它们。
go install编译并安装包及其依赖项。
go list列出包或模块的信息。
go mod用于模块维护,包括初始化模块、添加和更新依赖项等。
go work用于工作区维护,例如查看、清理或打印工作区信息。
go run编译并运行Go程序。
go test运行包的测试。
go tool运行指定的Go工具。
go version打印Go的版本信息。
go vet检查 Go 源码并报告可疑的错误。

1.1 go build

Go 是强类型编译型语言,因此编译时会将所有依赖编译进同一个二进制文件。

参数介绍

  • -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

新建 main.go 的源文件,键入下面这些代码:

package mainimport "fmt"func main() {fmt.Println("你好, 兰州!")
}

打开终端,通过如下命令来编译和运行这个文件了:

go build main.go
./main
1.1.1 指定输出目录
  • go build –o [目录]
mkdir bin # 创建bin 目录
go build -o bin/hello # 编译hello
./bin/hello # 
1.1.2 常用环境变量设置编译操作系统和 CPU 架构
  • 设置编译操作系统
# 设置 GOOS 环境变量为 "linux",指定目标操作系统为 Linux
# 然后使用 go build 编译当前目录中的 Go 代码,并将输出文件命名为 bin/hello
GOOS=linux go build -o bin/hello
./bin/hello 

image-20230922213138895

  • 设置编译CPU架构
# 设置 GOOS 环境变量为 "linux",指定目标操作系统为 Linux
# 设置 GOARCH 环境变量为 "amd64",指定目标 CPU 架构为 64 位 x86
# 然后使用 go build 编译当前目录中的 Go 代码,并将输出文件命名为 bin/hello
GOOS=linux GOARCH=amd64 go build -o bin/hello
1.1.3 查看支持的操作系统和CPU架构

要查看Go支持的所有操作系统和CPU架构的列表,您可以查看Go源代码中的 syslist.go 文件。这个文件位于 $GOROOT/src/go/build/syslist.go。下面是一个示例命令,用于查看支持列表:

cat $GOROOT/src/go/build/syslist.go

这将打印出Go支持的操作系统和CPU架构的完整列表。

通过这些示例,您可以了解如何在Go中指定输出目录和设置编译操作系统和CPU架构。这些功能非常有用,特别是在需要交叉编译或控制输出位置时。

1.2 go test

go test 命令用于运行Go程序包中的测试。Go的测试是通过在与被测试的代码文件相同目录下的 _test.go 文件中编写测试函数来完成的。这里介绍几个常用的参数:

  • -bench regexp 执行相应的benchmarks,例如 -bench=.
  • -cover 开启测试覆盖率
  • -run regexp 只运行regexp匹配的函数,例如 -run=Array 那么就执行包含有Array开头的函数
  • -v 显示测试的详细命令

以下是使用 go test 命令的基本用法:

  1. 进入包含要测试的Go代码的目录。
  2. 确保在该目录下有一个或多个 _test.go 文件,其中包含测试函数。测试函数的命名必须以 Test 开头,后跟被测试函数的名称,并接受一个名为 t *testing.T 的参数。
  3. 运行以下命令来执行测试:
go test

go test 将自动查找并运行当前目录和子目录中的所有测试文件,并输出测试结果。它将显示通过的测试数量、失败的测试数量以及测试覆盖率等信息。

如果您想只运行特定的测试文件或测试函数,可以在 go test 后面提供测试文件或测试函数的名称。例如,要运行名为 TestMyFunction 的测试函数,可以执行以下命令:

go test -run TestMyFunction

go test 还支持许多其他标志和选项,用于控制测试的行为,例如覆盖率分析、并行测试等。您可以使用 go help test 命令查看完整的 go test 文档以获取更多详细信息。

这里简单举个栗子, 新建 main_test.go 的源文件,键入下面这些代码:

package mainimport ("fmt""testing"
)func add(a, b int) int {return a + b
}
func TestIncrease(t *testing.T) {t.Log("Start testing")result := add(1, 2)if result == 3 {fmt.Println("OK")} else {fmt.Println("有问题!")}
}

这里我们队add 这个函数进行测试,验证输出结果,运行如下命令进行测试:

# 运行当前目录及其子目录下的所有测试文件中的测试函数
go test .# 运行指定名称的测试函数(例如,TestIncrease)
go test -run TestIncrease

image-20230922221352675

go test ./… 运行测试 go test命令扫描所有*_test.go为结尾的文件,惯例是将测试代码与正式代码放在同目录(同一个包), 如 foo.go 的测试代码一般写在 foo_test.go

1.3 go vet

go vet 是 Go 编程语言的一个静态分析工具,用于检查 Go 代码中可能包含的潜在错误、不规范的代码和常见问题。它的主要目标是帮助开发人员识别和修复可能导致程序运行时错误的问题,以提高代码的质量和可靠性。

  • -all: 执行所有可用的 go vet 检查。默认情况下,go vet 只运行一些常见的检查,但使用 -all 标志可以启用所有检查。

  • -shadow: 检查代码中的变量阴影问题。这个标志用于检测局部变量覆盖外部变量的情况。

  • -printfuncs list: 自定义 Printf 样式函数的检查。您可以指定一个逗号分隔的函数列表,go vet 将检查是否正确使用了这些函数来格式化字符串。

  • -composites: 检查使用复合文字(composite literals)时的问题。这个标志用于检测复合文字的使用是否符合规范。

  • -copylocks: 检查复制锁的问题。这个标志用于检测代码中是否存在复制锁,以及它们是否正确使用。

  • -lostcancel: 检查丢失的上下文取消问题。这个标志用于检测代码中是否存在未正确处理的上下文取消。

  • -methods: 检查接口方法问题。这个标志用于检测接口是否被正确实现。

  • -printf: 检查格式化字符串问题。这个标志用于检测 Printf 样式的格式化字符串是否正确匹配参数。

  • -unreachable: 检查不可达代码问题。这个标志用于检测不会被执行的代码块。

  • -shadowstrict: 启用更严格的变量阴影检查。这个标志用于检测更多的变量阴影情况。

举个简单例子,比如printf调用中的参数不匹配:

package mainimport ("fmt"
)func main() {name := "testing"fmt.Printf("%d\n", name)fmt.Printf("%s\n", name, name)
}

运行命令:

go vet  

image-20230922222809096

1.4 go clean

用于清理构建过程中生成的临时文件和构建缓存。它有助于确保项目处于干净的状态,删除构建过程中生成的中间文件,以便重新构建项目时不会受到旧文件的影响。

参数介绍

  • -i 清除关联的安装的包和可运行文件,也就是通过go install安装的文件
  • -n 把需要执行的清除命令打印出来,但是不执行,这样就可以很容易的知道底层是如何运行的
  • -r 循环的清除在import中引入的包
  • -x 打印出来执行的详细命令,显示 go clean 执行的每个步骤。
  • go clean -testcache: 使用 -testcache 标志来清除测试缓存。这将删除与测试相关的缓存文件。
  • go clean -modcache: 使用 -modcache 标志来清除模块缓存。这将删除模块依赖项的缓存文件。

1.5 go fmt

用于格式化源代码文件,以确保它们符合 Go 语言的编码规范和格式化约定。go fmt 命令的主要目的是使代码在不同项目和团队中保持一致的风格,提高代码的可读性和可维护性。

参数介绍

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

1.6 go get

用于下载、安装和更新 Go 语言包(也称为模块)以及它们的依赖项。这个命令通常用于获取外部包。

参数介绍:

  • -d 只下载不安装
  • -f 只有在包含了-u参数的时候才有效,不让-u去验证import中的每一个都已经获取了,这对于本地fork的包特别有用
  • -fix 在获取源码之后先运行fix,然后再去做其他的事情
  • -t 同时也下载需要为运行测试所需要的包
  • -u 强制使用网络去更新包和它的依赖包
  • -v 显示执行的命令

看一个实际的例子:

在本地通过源码安装 Go 的调试器 Delve,可以这么做:

go get github.com/go-delve/delve/cmd/dlv

1.7 go install

用于编译和安装 Go 包或程序。当你运行 go install 时,它会编译当前目录中的 Go 代码,并将生成的二进制可执行文件放置在你的 Go 工作空间的 bin 目录中(通常位于 GOPATH 中)。

参数介绍:

  • -i:安装到GOBIN环境变量指定的目录,默认为GOPATH/bin
  • -n:打印将要执行的命令,但不执行。
  • -v:显示执行的命令。
  • -x:打印执行的命令及其参数。
  • -work:打印临时工作目录的名称,然后退出。
  • -pcgo:针对cgo enabled的包,调用gcc来编译。
  • -pkgdir:安装完成后的包文件存放目录。
  • -tags:构建标签,用于选择性地编译相应的代码。
  • -trimpath:移除文件名中的GOPATH路径前缀。
  • -mod:模块下载和解析模式,可设为mod、vendor等。

1.8 go tool

用于运行各种Go语言工具,主要的参数包括:

  • -n:打印将要执行的命令,但不执行。
  • -x:打印执行的命令及其参数。
  • -V:打印go tool和执行命令的版本信息。
  • -e:只有在命令执行失败时才打印输出。
  • -json:以JSON格式输出结果。

常见的子命令及其用途:

  • cover:测试覆盖率分析工具。
  • fix:代码迁移工具,可以自动更新旧代码到新语法。
  • fmt:格式化Go代码的工具。
  • vet:源码检查工具,用于发现代码错误。
  • doc:显示包的文档。
  • pprof:分析和查看分析数据。
  • trace:编译时跟踪工具。
  • link:链接器工具,查看二进制文件依赖。
  • addr2line:转换地址为文件/行号。
  • api:Go API处理工具。

1.9 go generate

这个命令是从Go1.4开始才设计的,用于在编译前自动化生成某类代码。go generatego build是完全不一样的命令,通过分析源码中特殊的注释,然后执行相应的命令。这些命令都是很明确的,没有任何的依赖在里面。而且大家在用这个之前心里面一定要有一个理念,这个go generate是给开发者用的,不是给使用这个包的人用的,是方便生成一些代码的。

举一个简单的例子,例如经常会使用yacc来生成代码,那么常用这样的命令:

go tool yacc -o gopher.go -p parser gopher.y

-o 指定了输出的文件名, -p指定了package的名称,这是一个单独的命令,如果想让go generate来触发这个命令,那么就可以在当前目录的任意一个xxx.go文件里面的任意位置增加一行如下的注释:

//go:generate go tool yacc -o gopher.go -p parser gopher.y

这里注意了,//go:generate是没有任何空格的,这其实就是一个固定的格式,在扫描源码文件的时候就是根据这个来判断的。

所以可以通过如下的命令来生成,编译,测试。如果gopher.y文件有修改,那么就重新执行go generate重新生成文件就好。

$ go generate
$ go build
$ go test

1.10 godoc

在Go1.2版本之前还支持go doc命令,但是之后全部移到了godoc这个命令下,需要这样安装go get golang.org/x/tools/cmd/godoc

很多人说go不需要任何的第三方文档,例如chm手册之类的,因为它内部就有一个很强大的文档工具。

如何查看相应package的文档呢?

例如builtin包,那么执行godoc builtin

如果是http包,那么执行godoc net/http

查看某一个包里面的函数,那么执行godoc fmt Printf

也可以查看相应的代码,执行godoc -src fmt Printf

通过命令在命令行执行 godoc -http=:端口号 比如godoc -http=:8080。然后在浏览器中打开127.0.0.1:8080,将会看到一个golang.org的本地copy版本,通过它可以查询pkg文档等其它内容。如果设置了GOPATH,在pkg分类下,不但会列出标准包的文档,还会列出本地GOPATH中所有项目的相关文档,这对于经常被墙的用户来说是一个不错的选择。

1.11 go run

用于编译并运行 Go 源代码文件。它是一个方便的工具,可用于在不需要显式构建可执行文件的情况下直接运行 Go 程序。常用的参数包括:

  • -n:打印执行的命令,但不执行。
  • -x:打印执行的命令及参数。
  • -race:启用数据竞争检测。
  • -gcflags:传递参数给编译器,如优化级别等。
  • -buildmode:指定编译模式,如共享库或插件等。
  • -ldflags:传递参数给链接器。
  • -trimpath:去除输出中的文件路径信息。
  • -memprofile:写入内存概要文件。
  • -cpuprofile:写入CPU概要文件。
  • -blockprofile:写入阻塞概要文件。
  • -timeout:执行超时时间。
  • -args:传递参数给程序,放在最后。

例如:

go run -race -ldflags "-s -w" main.go args

此命令会启用竞争检测和移除调试信息,并传递args参数给main.go执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智思Ai企联系统去授权版本+uniapp前后端(内含教程)

智思AI企联系统是一款企业级AI系统,与普通版AI产品相比具备显著差异。该系统允许企业按需选择和定制二开任意功能,以满足不同企业的个性化需求和场景要求。企业可以根据实际业务需求扩展和改进系统功能模块,使之更好地适应企业独特需求。

【word格式】mathtype公式插入 | 段落嵌入后格式对齐 | 字体大小调整 |空心字体

1. 公式嵌入 推荐在线latex编辑器,可以截图转 latex 识别率很高 https://www.latexlive.com/home 美中不足,不开会员每天只能用3次识别。 通过公式识别后,输出选择align环境,然后在mathtype中直接粘贴latex就可以转好。 2.公式…

网络爬虫——HTTP和HTTPS的请求与响应原理

目录 一、HTTP的请求与响应 二、浏览器发送HTTP请求的过程 三、HTTP请求方法 四、查看网页请求 五、常用的请求报头 六、服务端HTTP响应 七、常用的响应报头 八、Cookie 和 Session 九、响应状态码 十、网页的两种加载方法 十一、认识网页源码的构成 十二、爬虫协议…

【Linux 之二】Ubuntu下开发环境的搭建(NFS \ SSH \ FTP \ Smba \ ...)

目前正在进行Linux相关项目的开发,而我的Linux开发是在Ubuntu(版本20.04)下进行的,为此需要搭建很多Linux相关的开发环境,方便工作的进行。这里主要是对各种开发环境的搭建做一个总结记录,方便后面查阅&…

LeetCode【69. x 的平方根】

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&#xff1…

FPGA原理与结构(0)——目录与传送门

一、 简介 FPGA的设计和软件设计不同,我们所设计的RTL代码最终还是要落实到硬件底层来进行实例化,因此理解硬件底层的内容是很有意义的。 二、可编程逻辑块CLB 可配置逻辑块CLB(Configurable Logic Block)是xilinx系类FPGA的基本…

操作系统--------调度算法篇

目录 一.先来先服务调度算法(FCFS) 二.短作业优先调度算法(SJF) 2.1.SJF调度算法缺点 三.优先级调度算法 3.1优先级调度算法的类型 1.非抢占优先级调度算法 2.抢占优先级调度算法 3.2优先级的类型 3.1静态优先级 3.2动态…

肖sir__mysql之存储练习题__013

实验 一、 实验要求: 理解存储过程的概念掌握存储过程的语法格式、使用方法掌握存 储过程的创建、执行 二、实验前提: – drop table if exists student; – Create table student – (Id varchar(255), #学号 – Name varchar(255), #姓名 – Roomid…

生成式模型和判别式模型区别

目录 1.概念 2.定义​ 3.举例​ (1)例子 A​ (2)例子 B​ 4.特点 5.优缺点 6.代表算法 1.概念 首先我们需要明确,两种不同的模型都用于监督学习任务中。监督学习的任务就是从数据中学习一个模型,并用…

golang优先级坑

看如下代码,我本以为a1, a2是相同的 package mainimport "fmt"func main() {b, c, d : 1, 0, 1a1 : b ^ c&(^d) // 1 ^a2 : c ^ b&(^d) // 0 ^fmt.Println(a1, a2) // 1 0 }但结果却是不同的,在golang中&的优先级^和|…

使用 PyTorch 的计算机视觉简介 (1/6)

一、说明 Computer Vision(CV)是一个研究计算机如何从数字图像和/或视频中获得一定程度的理解的领域。理解这个定义具有相当广泛的含义 - 它可以从能够区分图片上的猫和狗,到更复杂的任务,例如用自然语言描述图像。 二、CV常见的问…

RocketMQ高性能核心原理与源码架构剖析

文章目录 1、源码环境搭建1.1、主要功能模块1.2、源码启动服务1.2.1、 启动nameServer1.2.2、 启动Broker1.2.3、 发送消息1.2.4、 消费消息 2、源码剖析2.1、NameServer的启动过程2.2、Broker服务启动过程2.3、Netty服务注册框架2.3.1、关注重点2.3.2、源码重点 1、源码环境搭…

AJAX学习

文章目录 创建 XMLHttpRequest 对象向服务器发送请求XMLHttpRequest.open()XMLHttpRequest.send()GET或POST 服务器响应XMLHttpRequest 的属性XMLHttpRequest.readyStateXMLHttpRequest.onreadystatechangeXMLHttpRequest.responseXMLHttpRequest.responseTypeXMLHttpRequest.r…

OpenAI官方吴达恩《ChatGPT Prompt Engineering 提示词工程师》(7)聊天机器人 / ChatBot

聊天机器人 / ChatBot 使用大型语言模型来构建你的自定义聊天机器人 在本视频中,你将学习使用OpenAI ChatCompletions格式的组件构建一个机器人。 环境准备 首先,我们将像往常一样设置OpenAI Python包。 import os import openai from dotenv import…

ruoyi框架修改左侧菜单样式

菜单效果 ruoyi前端框架左侧的菜单很丑,我们需要修改一下样式,下面直接看效果。 修改代码 1、sidebar.scss .el-menu-item, .el-submenu__title {overflow: hidden !important;text-overflow: ellipsis !important;white-space: nowrap !important;//…

vue3——pixi初学,编写一个简单的小游戏,复制粘贴可用学习

pixi官网 小游戏效果 两个文件夹 一个index.html 一个data.js //data.js import { reactive } from "vue"; import { Sprite, utils, Rectangle, Application, Text, Graphics } from "pixi.js";//首先 先创建一个舞台 export const app new Applicat…

QT配置MySQL数据库 ninja: build stopped: subcommand failed

QT配置MySQL数据库 我当前的软件版本:QT Creator 10.0.2 (community),MingW 6.4.3 (QT6),MySQL 8.0。 MySQL不配置支持的数据库有QList("QSQLITE", "QODBC", "QPSQL"),这个时候是不支持MYSQL数据…

[极客大挑战 2019]RCE ME 取反绕过正则匹配 绕过disable_function设置

目录 取反 1.蚁剑插件绕过 2.baypass disable_function open_dir/disable_function putenv()/LD_PRELOAD 来绕过限制 利用条件 利用思路 有意思。。。。 <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("Th…

windbg -I之后如何恢复原有的

直接运行了一下windbg -I&#xff0c;抓取了注册表行为&#xff0c;然后这里记录一下&#xff0c;方便翻阅。 抓取到的windbg的注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger 将值改为 "C:\WINDOWS\system32\vsji…

git 本地工作区和仓库区基本使用

(1)git 本地有三个区 工作区和暂存区和 git管理的仓库. &#xff08;自行动手实践理解,然后就入门了&#xff09;(2)本地初次使用git做的事情,需要做如下工作 git config --global user.name "xx" git config --global user.email xxxqq.com git config --globa…