go tool 的基本应用

本文详细介绍Go语言开发环境搭建、版本控制、编译方法、依赖管理、单元测试等内容,并提供了实用工具推荐与部署监控策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

go 开发的准备工作

go版本的控制

go语言的编译

获取依赖包的使用

mod的基本操作

go test 单元测试

代码规范检测 

goctl:代码生成工具

go项目的部署

常见错误处理


go 开发的准备工作

  1. golang安装
  2. go modudle配置
  3. goctl安装
  4. protoc&protoc-gen-go安装
  5. etcd的安装
  6. ide的安装和配置

安装步骤和流程见:  https://zeromicro.github.io/go-zero/prepare.html
 

go版本的控制

查看当前 go的版本 go version

  1. go多版本控制工具---gvm

安装方式如下:

 bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

校验是否安装成功:

gvm version

如果不成功,可能会提示错误,注意需要配置host 文件

   2. 查看已经安装的版本有哪些?

        gvm list

   3. 查看所有的版本

      gvm listall

  4. 指定安装哪个版本

     gvm install  go1.16 -B    安装最新的1.16版本

 5. go版本的使用和切换

   gvm use go1.16

 

go语言的编译

go build     最常用的编译go 文件 

go install  只是将编译的中间文件放在 GOPATH 的 pkg 目录下,以及固定地将编译结果放在 GOPATH 的 bin 目录下。

go build 文件
go install 文件  本地打包编译命令

 

GO111MODULE 有三个值:off, on和auto(默认值)

获取依赖包的使用

go get github.com/tal-tech/go-zero/core/discov      下载项目依赖包

go get github.com/tal-tech/go-zero/core/disco@latest   下载最新包

go get github.com/tal-tech/go-zero/core/disco@master    拉取master分之最新的commit

go get -u-patch github.com/tal-tech/go-zero/core/disco  更新到最新的修改bug的版本

go get github.com/tal-tech/go-zero/core/disco@v1.0.0     根据tag 拉取commit

go get github.com/tal-tech/go-zero/core/disco@commit_id     根据commit_id 获取依赖包 或自动转为对应的tag

go get github.com/tal-tech/go-zero/core/disco/v3 指定版本拉取

go get -u            更新包

 

mod的基本操作

模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。

modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。

go help mod 查看命令

 

具体实现见以下说明:

创建一个模块 mkdir gomods && cd gomods

初始化模块 模块名为项目名

go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。go toolchain会在各类命令执行时,比如go get、go build、go mod等修改和维护go.mod文件。

go mod init gomods
  1. mod download 使用  目前所有模块版本数据均缓存在 $GOPATH/pkg/mod和 ​$GOPATH/pkg/sum 下 直接下载依赖包到本地缓存
  2. go mod download
  3. 编辑go.mod文件 选项有-json-require-exclude,可以使用帮助go help mod edit 
  4. go help mod edit
    
    go mod edit -fmt // 如果手动编辑 可以用fmt进行格式化
    
    go mod edit -require=golang.org/x/text   添加依赖 会自动加载到.mod 文件
    
    go mod edit -replace=golang.org/x/crypto@v0.0.0=github.com/golang/crypto@latest  //替代依赖包
    
    
    
    module语句指定包的名字(路径)
    require语句指定的依赖项模块
    replace语句可以替换依赖项模块
    exclude语句可以忽略依赖项模块
    
    
    以文本模式打印模块需求图
go mod graph
  1. 删除错误或者不使用的modules 获取依赖的和清理不依赖的或者无效包
go mod tidy
  1. 生成vendor目录
go mod vendor
  1. 验证依赖是否正确
go mod verify
  1. 清理moudle 缓存
go clean -modcache
  1. 查看某个依赖包可下载的版本 
go list -m -versions github.com/gogf/gf
go list -m  -json all

go list -m输出的信息被称为build list,也就是构建当前module所要构建的所有相关package(及版本)的列表。

go list -m 

go mod 包依赖分为2中: 本地项目:

1:  同一个项目之间引用包

    具体事例见 moduledemo 项目 (mod 模块需要用replace)

2、不同项目之间引用包

   具体事例见 moduledemo 项目 和mypackage 项目 统一目录的项目

   注意点: 如果引用的最后的包名一样的话(无论路径是否相同),会导致错误,给包起个别名可以解决

 

3、远程控制事例:

  见onemod 项目 在 twomod的应用

备注: 库的 版本升级规范

vendar -》 gopath  

 

 

go test 单元测试

特殊:不需要 main() 作为函数入口。所有在以_test结尾的源码内以Test开头的函数会自动被执行

  • 每一个test文件需要import一个testing
  • 默认的情况下,go test命令不需要任何的参数,它会自动把你源码包下面所有 test 文件测试完毕,当然你也可以带上参数。
  • 这里介绍几个常用的参数:
  • -bench regexp 执行相应的 benchmarks,例如 -bench=.;
  • -cover 开启测试覆盖率;
  • -run regexp 只运行 regexp 匹配的函数,例如 -run=Array 那么就执行包含有 Array 开头的函数;
  • -v 显示测试的详细命令

   测试事例:

​​package main

import (
	"fmt"
	"testing"
)

/*test 测试,可以没有main 作为函数入口*/
func TestHelloWord(t *testing.T) {
	fmt.Println("测试单元")
	t.Log("Hello word")
}

/*执行方式 go test helloworld_test.go*/

/*可以多个测试函数*/
func TestHelloWord2(t *testing.T) {
	fmt.Println("测试单元")
	t.Log("Hello word")
}

/*默认多个测试案例一次测试,如果想指定特定函数 可以执行 go test run TestHelloWord2 helloword_test.go*/

/*终止测试单元*/
func TestFailNow(t *testing.T) {
	t.Log("stop2 Hello word")
	t.FailNow()
	t.Log("stop2 Hello word")
}

/*标记错误不终止*/
func TestFail(t *testing.T) {

	fmt.Println("before fail")

	t.Fail()

	fmt.Println("after fail")
}

/*一下是基准测试用例基准测试——获得代码内存占用和运行效率的性能数据*/

/*开启基准测试 go test -v -bench=. helloword_test.go
第 1 行的-bench=.表示运行 benchmark_test.go 文件里的所有基准测试,和单元测试中的-run类似。
第 4 行中显示基准测试名称,2000000000 表示测试的次数,也就是 testing.B 结构中提供给程序使用的 N。
“0.33 ns/op”表示每一个操作耗费多少时间(纳秒)。

*/

/*如果bench 和test 在同一个测试文件中,执行某个test 或者指定某个bench执行的时候,需要按照一下方式
go test -v  helloword_test.go -test.bench Add -test.run Add

go test -v  helloword_test.go  -test.run TestHelloWord2

*/

func Benchmark_Add(b *testing.B) {
	var n int
	for i := 0; i < b.N; i++ {
		n++
	}
}

/*内存测试
go test -v -bench=Alloc -benchmem helloword_test.go

由于和test在同一个文件中 可用go test -v -bench=Alloc -benchmem helloword_test.go -test.bench Alloc -test.run Alloc 执行
第 1 行的代码中-bench后添加了 Alloc,指定只测试 Benchmark_Alloc() 函数。
第 4 行代码的“16 B/op”表示每一次调用需要分配 16 个字节,“2 allocs/op”表示每一次调用有两次分配。
*/
func Benchmark_Alloc(b *testing.B) {
	for i := 0; i < b.N; i++ {
		fmt.Sprintf("%d", i)
	}
}


/*go pprof 命令

Go语言工具链中的 go pprof 可以帮助开发者快速分析及定位各种性能问题,如 CPU 消耗、内存分配及阻塞分析。 具体看文档*/


代码规范检测 

 1、ide 配置插件-代码格式化 gofmt

     gofmt -代码格式化:  func def() erro{} 之间的空格等

2、golint --对代码定义规范的检查 (主要 各种语法规范校验)

     Golint会对代码做以下几个方面检查 

     package注释 必须按照 “Package xxx 开头”
     package命名 不能有大写字母、下划线等特殊字符
    struct、interface等注释 必须按照指定格式开头
    struct、interface等命名
    变量注释、命名
    函数注释、命名

golint file     //检测文件
golint dir      //检测目录

 

goctl:代码生成工具

具体文档参考: https://zeromicro.github.io/go-zero/goctl.html

具体事例: https://www.yuque.com/tal-tech/go-zero/tdsgkg

goctl: API

goctl rpc goctl rpc命令可以根据proto文件生成rpc服务代码,具体功能如下

启动rpc 服务端需要依赖 etcd  如果没有安装 需要先安装:

brew install etcd 

goctl template 

goctl template命令用于对于api、rpc、model等代码生成模板管理,方便开发人员对模板进行自定义 具体样子见代码 bookstore

 客户端和服务端项目的启动和调用: 见项目bookstore 

goctl 见巨扬分享的开发文档: 框架文档:https://www.yuque.com/tal-tech/go-zero/yaoehb

 

插件: 

file watcher: 作用:可以格式化代码

Save Actions: 作用:保存的时候可以自动删除一些不用的导入等

key promoter x : 作用: 点击方式完成时 提示的快捷方式

viper: 1. 支持Yaml、Json、 TOML、HCL 等格式的配置等

goclt

gofmt

 

 

go项目的部署

1、supervisor 管理 golang 进程

 将创建的项目打包上传到服务器 和目前保持一致

 在supervisord 的配置文件下添加项目配置

cd /etc/supervisor/conf.d

具体用已有项目事例

直接启动 supervisord

查看是否启动

supervisorctl status

参考文档:

https://zeromicro.github.io/go-zero/service-deployment.html
 

2、jekins的部署: 

主要是基于git  docker jekins build实现。

https://zeromicro.github.io/go-zero/service-deployment.html 

这个后续项目成熟一些在测试部署

3、服务监控 :

基于prometheus的微服务指标监控

go-zero 框架中集成了基于prometheus的服务指标监控

https://zeromicro.github.io/go-zero/service-monitor.html

插件的介绍:

后续用到一次补充

 

远程调试:

go的异步任务

    1、Machinery  5k*

    获取下来源码:

   go get -u github.com/RichardKnop/machinery/v1

   具有哪些特性:

  • 任务重试机制
  • 延迟任务支持
  • 任务回调机制
  • 任务结果记录
  • 支持Workflow模式:Chain,Group,Chord
  • 多Brokers支持:Redis, AMQP, AWS SQS
  • 多Backends支持:Redis, Memcache, AMQP, MongoDB

 Machinery 的简单设计结构图

 

一般生产者先调用 signature := tasks.NewSignature 定义好任务,然后 machineryServer.SendTask 就完成了任务的产生。
具体使用参考使用教程:

其它: cron  7.5* 

 

常见错误处理

1、goctl找不到

     goctl 需要添加到环境变量中

2、  greet api 运行api的时候,提示 no required module provides package github.com/tal-tech/go-zero/core/conf; to add it:

       需要通过 go mod tidy 来清理和获取相应的依赖包

3、go get 失效

      go env -w GOPROXY=https://goproxy.cn  修改国内代理配置  后用go get 就解决了

      git clone 依赖包直接到GOPATH/src/下
     cd /d  %GOPATH%/src/
     git clone https://github.com/golang/net.git

4、 启动rpc服务的时候失败: exect state 2 

      没有启动 etcd 的原因 ,启动etcd 后正常

 goctl model 与数据库关联  goctl model mysql datasource -url="dever:dever@tcp(123.57.148.27:16033)/cms_db" -table="cms_user" -dir ./model   对应的分别是 用户名:用户名密码@tcp(mysql地址)/ 哪个数据库 哪个数据表, 全部的数据表可以用 *

优先级---

执行流程--

原理--

why

版本升级流程规范

上线规范

 

 

 

参考文档:

http://www.topgoer.com/%E5%BC%80%E6%BA%90/%E5%8C%85%E8%A3%85%E7%AE%A1%E7%90%86.html



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值