Golang常用命令工具链介绍
golang语言提供非常强大的工具链,包括编译、测试、重构代码、文档、从github中pull第三方库等
go build命令
go build命令常用于将Go文件编译成相应平台的可执行文件
go build 主文件名,编译成功后就会自动一个可执行文件
也可以使用自定义编译的方式
GOOS=windows GOARCH=amd64 go build main.go
GOOS:表示系统名称的缩写(linux/mac/windows)
GOARCH:表示系统位数(amd64)
go install命令
go install与go build最大的不同在于,go install编译后会输出文件打包成库放到pkg文件下,下次使用的时候不再进行编译,方便使用
go get命令
go get命令表示获取第三方包,默认从github中pull第三方库或者项目到自己的GOPATH目录下
通过使用:go get 项目网站/作者/项目名
以Gin Web框架为例:go get -u github.com/gin-gonic/gin
-u:表示使用最新的包,重复的文件不更新
-v:表示显示操作流程的日志及信息
go fmt命令
go fmt命令类似于C的lint,但是lint只会检查问题,而go fmt代码进行格式化一遍,统一代码风格,方便维护
格式化前的代码
func main() {
server := http.Server{
Addr: fmt.Sprintf(":%v", "8080"),
}
http.HandleFunc("/requestBody", RequestBody)
http.HandleFunc("/process", process)
server.ListenAndServe()
}
格式化后的代码
func main() {
server := http.Server{
Addr: fmt.Sprintf(":%v", "8080"),
}
http.HandleFunc("/requestBody", RequestBody)
http.HandleFunc("/process", process)
server.ListenAndServe()
}
使用go fmt命令后,会显示格式化了那些文件
go test命令
go test命令用于测试和验证代码的完整性
go test文件一般以xxxx_test命名
使用go test 命令时,将xxxx_test.go结尾和Test开头的函数都自动执行,否则go test会直接跳过该测试用例不执行
TestXXX测试用例需要传入*testing.T或b *testing.B(测试性能)作为参数
创建xxxx_test.go文件
request.go文件代码
package main
func PrintNum() int {
result := 0
for idx := 0; idx < 100; idx++ {
result += idx
}
return result
}
func main() {
}
request_test.go文件代码如下
package main
import (
"fmt"
"testing"
)
func TestPrice(t *testing.T) {
result := PrintNum()
fmt.Println("hey:", result)
if result != 2050 {
t.Errorf("结果错误")
}
}
使用go test 命令结果如下
也可以使用 go test -v命令或者go test -v -run,-v表示test的一些详细信息,-run表示单独执行测试函数名,测试函数名可以是正则表达式
t.SkipNow():跳过当前测试用例,将当前测试用例进行PASS处理并继续执行下一个测试用例,不管测试用例有没有出现问题
如果想要测试用例按照顺序执行,可以使用subTest
package main
import (
"fmt"
"testing"
)
func testPrintNum1(t *testing.T) {
result := PrintNum()
fmt.Println("hey:", result)
if result != 4950 {
t.Errorf("结果错误 TestPrintNum1")
}
}
func testPrintNum2(t *testing.T) {
result := PrintNum()
result--
if result != 4949 {
t.Errorf("结果错误 TestPrintNum2")
}
}
func TestAll(t *testing.T) {
t.Run("TestPrintNum1", testPrintNum1)
t.Run("TestPrintNum2", testPrintNum2)
}
如果想要在执行测试用例前做一些初始化操作,可以使用TestMain,传入m *testing.M作为参数
package main
import (
"fmt"
"testing"
)
func testPrintNum1(t *testing.T) {
result := PrintNum()
fmt.Println("hey:", result)
if result != 4950 {
t.Errorf("结果错误 TestPrintNum1")
}
}
func testPrintNum2(t *testing.T) {
result := PrintNum()
result--
if result != 4949 {
t.Errorf("结果错误 TestPrintNum2")
}
}
func TestAll(t *testing.T) {
t.Run("TestPrintNum1", testPrintNum1)
t.Run("TestPrintNum2", testPrintNum2)
}
func TestMain(m *testing.M) {
fmt.Println("TestMain Begin......")
m.Run()
}
如果使用了初始化Tset,没有调用m.Run()方法时,除了初始化测试用例之外的测试用例都不会执行
注释m.Run()方法可以发现,只执行了初始化测试用例
基准测试
获得代码内存占用和运行效率的性能数据,传入(b *testing.B)参数
使用for循环,b.N作为结束条件,b.N是一个可变的值,根据每一次操作耗费多少时间(纳秒)来改变,即到了一个稳定的纳秒结束,输出次数
package main
import (
"fmt"
"testing"
)
func BenchPrintNum(b *testing.B) {
for n := 0; n < b.N; n++ {
PrintNum()
}
}
使用 go get -v -bench="."
linux版本需要去除双引号,即go get -v -bench=.
go run命令
编译并执行go文件
需要注意的是该文件package 为main包,并且存在main()主函数,否则出现 cannot run non-main package错误信息,无法编译运行
go env命令
查看当前go的环境变量等信息
go version
查看当前golang的版本
最后golang 常用命令就介绍到这了