超好用的golang工具分享

go-callvis-代码调用关系的可视化工具

go-callvis是一个代码调用关系的可视化工具,它可以帮助我们了解指定项目代码的结构,以达到更快的理解代码意图的目的。

工具使用简单,步骤如下:

// 1. 安装
git clone https://github.com/ofabry/go-callvis.git
cd go-callvis && make install// 2. 以著名golang开源项目bigcache 的main函数为入口,分析代码调用关系(不打开浏览器 | 忽略标准库的方法)
go-callvis -skipbrowser -nostd ./server/// 3. 访问http://localhost:7878查看调用关系矢量图

调用关系矢量图怎么看,一共分为三个部分:

Packages / Types(包)

RepresentsStyle
focused(需要关注的)blue color(蓝色)
stdlib(标准库)green color(绿色)
other(其他包)yellow color(黄色)

Functions / Methods(函数方法)

RepresentsStyle
exported(导出的包)bold border(粗边框)
unexported(未导出包)normal border(正常边框)
anonymous(匿名包)dotted border(虚线边框)

Calls(调用)

RepresentsStyle
internal(内部)black color(黑色)
external(外部)brown color(棕色)
static(静态函数)solid line(实线)
dynamic(动态函数)dashed line(虚线)
regular(常规函数)simple arrow(简单箭头)
concurrent(协程)arrow with circle(箭头带圆圈)
deferred(defer)arrow with diamond(箭头带菱形)

gotests-自动生成单测用例框架

gotests工具可以帮我们自动生成单测用例框架,这样以来,我们只需要关注需要测试的业务代码逻辑即可,省去了大量的拷贝复制的重复劳动。

gotest工具使用也是十分方便,可以直接安装(go get -u github.com/cweill/gotests/...)后用命令行($ gotests [options] PATH ...)的方式,或者也可以作为IDE的插件直接使用,如Emacs,Vim,Atom Editor,Visual Studio Code, andIntelliJ Goland. 这里以VS Code为例:

// 一个简单工厂模式代码实现package simplefactoryimport "fmt"//API is interface
type API interface {Say(name string) string
}//NewAPI return Api instance by type
func NewAPI(t int) API {if t == 1 {return &hiAPI{}} else if t == 2 {return &helloAPI{}}return nil
}//hiAPI is one of API implement
type hiAPI struct{}//Say hi to name
func (*hiAPI) Say(name string) string {return fmt.Sprintf("Hi, %s", name)
}//HelloAPI is another API implement
type helloAPI struct{}//Say hello to name
func (*helloAPI) Say(name string) string {return fmt.Sprintf("Hello, %s", name)
}

自动生成的测试用例框架,如下:

PS D:\code\golang-design-pattern\00_simple_factory> gotests.exe  -all .\simple.go
Generated TestNewAPI
Generated Test_hiAPI_Say
Generated Test_helloAPI_Say
package simplefactoryimport ("reflect""testing"
)func TestNewAPI(t *testing.T) {type args struct {t int}tests := []struct {name stringargs argswant API}{// TODO: Add test cases.}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {if got := NewAPI(tt.args.t); !reflect.DeepEqual(got, tt.want) {t.Errorf("NewAPI() = %v, want %v", got, tt.want)}})}
}func Test_hiAPI_Say(t *testing.T) {})}
}func Test_helloAPI_Say(t *testing.T) {type args struct {name string}tests := []struct {name stringh    *helloAPIargs argswant string}{// TODO: Add test cases.}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {h := &helloAPI{}if got := h.Say(tt.args.name); got != tt.want {t.Errorf("helloAPI.Say() = %v, want %v", got, tt.want)}})}
}
PS D:\code\golang-design-pattern\00_simple_factory>

go-multierror-多错误管理

在关于使用 Go 语言的时候,开发者面对最大的挑战的年度调查中,错误(error)管理总是能引起很多争论。在并发环境处理 error 的场景下,或者在同一个 goroutine 中合并多个错误的场景下,Go 提供了很不错的包可以让多个错误的处理变得简单:来看看如何合并由单个 goroutine 生成的多个 error。

go-multierror提供了常用的多错误管理四种方式:

Building a list of errors / Accessing the list of errors / Checking for an exact error value

构建错误返回列表 / 访问误返回列表 / 检查错误列表中是否包含某个错误

package mainimport ("fmt""errors"multierror"github.com/hashicorp/go-multierror"
)func step1() error {return errors.New("xhihu")
}func step2() error {return errors.New("yhihu")
}func main() {var result errorif err := step1(); err != nil {result = multierror.Append(result, err)}if err := step2(); err != nil {result = multierror.Append(result, err)}fmt.Printf(result.Error())if merr, ok := result.(*multierror.Error); ok {// Use merr.Errors// merr.Errors -> []error    }if errors.Is(result, os.ErrNotExist) {// err contains os.ErrNotExist}return
}

Customizing the formatting of the errors / 自定义多错误时显示的整体的打印信息

var result *multierror.Error// ... accumulate errors here, maybe using Appendif result != nil {result.ErrorFormat = func([]error) string {return "errors!"}
}

goleak-内存泄漏检查

goroutine 泄漏会导致内存中存活的 goroutine 数量不断上升,直到把主机的CPU和内存全部吃爆,最终以服务宕机为止。所以,我们会想到有没有一种方法,可以在代码部署之前,来检查程序中是否存在goroutine 泄漏。

Uber 公司的 Go 团队在 GitHub 开源了他们的goroutine 泄漏检测器出来,一个与单元测试结合使用的工具。 goleak 可以监控当前测试代码中泄漏的 goroutine。下面有一个 goroutine 泄漏的例子:

//demo.go
func leak() error {go func() {time.Sleep(time.Minute)}()return nil
}//demo_test.go
func TestLeakFunction(t *testing.T) {defer goleak.VerifyNone(t)if err := leak(); err != nil {t.Fatal("error not expected")}
}

用例直接报错了,从报错信息中我们可以看到泄露的goroutine 的堆栈信息,以及 goroutine 的状态。

pprof性能分析+火焰图

Pprof是一个用于采样数据可视化和分析的工具。主要分析服务运行过程产生的:阻塞同步的堆栈信息,所有的goroutine堆栈信息,活动对象的内存分配信息,互斥锁的竞争持有者的堆栈,默认进行30s的CPU采样信息,查看创建新OS线程的堆栈信息等等。

我们可以利用prof进行性能监控,且可以生成监控信息文件,方便后续分析性能瓶颈或者是内存泄漏情况。

package mainimport ("fmt""time""log""net/http"_ "net/http/pprof""os""runtime"
)func alloc(outCh chan<- int) {buf := make([]byte, 1024)outCh <- 0
}func Leak() {outCh := make(chan int)go func() {if false {<-outCh}select {}}()tick := time.Tick(time.Second / 100)i := 0for range tick {i++fmt.Println(i)//一直分配内存,不释放放go alloc(outCh)
}func main() {log.SetFlags(log.Lshortfile | log.LstdFlags)log.SetOutput(os.Stdout)runtime.GOMAXPROCS(1)runtime.SetMutexProfileFraction(1)runtime.SetBlockProfileRate(1)// 需要性能分析的业务逻辑go Leak()go func() {// 通过http://locahost:6060/debug/pprof进行查看相关的监控信息文件if err := http.ListenAndServe(":6060", nil); err != nil {log.Fatal(err)}os.Exit(0)}()select{}
}1. go build  prof_demo.go2. ./prof_demo3. 手动登陆浏览器,通过http://locahost:6060/debug/pprof进行查看相关的监控信息文件4. go install github.com/google/pprof@latest5. yum install graphviz// 查看火焰图
6. pprof -http=:6061  http://192.168.159.140:6060/debug/pprof/profile

jsoniter-高性能json序列化工具

go语言多数用于云原生中的网咯服务,因此一个常见的场景就是数据的序列化和反序列化,一般都是利用json进行。这里推荐采用jsoniter替换掉go原生encoding/json,两者接口一致,但jsoniter的性能远远超过encoding/json,Benchmark详见如下:

ns/opallocation bytesallocation times
std decode35510 ns/op1960 B/op99 allocs/op
easyjson decode8499 ns/op160 B/op4 allocs/op
jsoniter decode5623 ns/op160 B/op3 allocs/op

import jsoniter "github.com/json-iterator/go"var json = jsoniter.ConfigCompatibleWithStandardLibrary
json.Marshal(&data)json.Unmarshal(input, &data)

Reference

Go代码调用链路可视化工具—go-callvis - 知乎 (zhihu.com)

GoTests工具自动化test使用 - 掘金 (juejin.cn)

Go: Multiple Errors Management. Error management in Go is always prone… | by Vincent Blanchon | A Journey With Go | Medium

Fastest JSON parser ever (jsoniter.com)

Go:多错误管理 - Go语言中文网 - Golang中文社区 (studygolang.com)

GitHub - hashicorp/go-multierror: A Go (golang) package for representing a list of errors as a single error

Go: Goroutine 泄漏检查器 - Go语言中文网 - Golang中文社区 (studygolang.com)

golang性能优化之pprof及其火焰图 - 简书 (jianshu.com)

Golang-PProf之性能剖析_-Xx.。的博客-CSDN博客_golang pprof allocs 解释

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

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

相关文章

ChatGPT写QT读写串口数据的Demo

突发奇想&#xff0c;想使用ChatGPT试试能不能写一个读写串口数据的demo,以下为测试结果&#xff1a; #include <QCoreApplication> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QDebug>int main(int ar…

蓝桥杯练习系统(算法训练)ALGO-983 最大获利

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 Chakra是一位年轻有为的企业家&#xff0c;最近他在进军餐饮行业。他在各地开拓市场&#xff0c;共买下了N个饭店。在初期的…

python 爬虫爬取知乎LOL图片(亲测)

获取信息 访问url后按f12调试 点击network 定位图片信息&#xff1a; 可以看到&#xff0c;每个图片的名字和下载地址在标红处&#xff0c;示例如下&#xff1a; data-actualsrc“https://pic4.zhimg.com/v2-1681ff26afbd5f92aa5790b4dee6a63f_b.jpg” 现在就是requests访问…

Linux之线程概念

目录 一、细粒度划分 1、堆区细粒度划分 2、物理内存和可执行程序细粒度划分 3、虚拟地址到物理地址的转化 二、线程的概念 1、基本概念 2、线程的优点 3、线程的缺点 4、线程异常 5、线程用途 三、Linux下的进程和线程 一、细粒度划分 1、堆区细粒度划分 在语言…

MySQL 备份方案

优质博文&#xff1a;IT-BLOG-CN 一、为什么要备份 【1】容灾恢复&#xff1a;硬件故障、不经意的 Bug 导致数据损坏&#xff0c;或者服务器及其数据由于某些原因不可获取或无法使用等&#xff08;例如&#xff1a;机房大楼烧毁&#xff0c;恶意的黑客攻击或 Mysql 的 Bug 等&…

8、Linux驱动开发:驱动-读写接口实现(readwrite)

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…

网络协议学习DAY1

1.网络协议模型: OSI协议模型 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式&#xff08;数据报、流式&#xff09; 网…

Seata 2.x 系列【4】产品简介

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot 版本 3.1.0 本系列Seata 版本 2.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 发展历史3. 核心术语3.1 TC3.2 TM3.3 RM 4.…

Unity3D 冯高光与布林冯高光经验模型详解

前言 Unity3D是一款非常流行的游戏开发引擎&#xff0c;它为开发者提供了丰富的功能和工具&#xff0c;使得开发游戏变得更加简单和高效。在Unity3D中&#xff0c;冯高光与布林冯高光经验模型是一种常用的光照模型&#xff0c;用来模拟光线在表面上的反射和折射效果。本文将详…

国创证券|存钱有窍门,掌握这五个窍门利息高出不少?

大部分居民会把手中闲置的资金存入银行&#xff0c;享用安稳的收益&#xff0c;其间存在以下五个诀窍&#xff1a; 1、比照不同银行的利率 储户在去银行存钱时&#xff0c;能够比照不同银行的利率&#xff0c;尽量地挑选利率较高的银行存&#xff0c;来获取较多的收益&#x…

MYSQL筛选字段是否为手机号码

1、需要判断导出的手机号正确性 2、观察到数据中包含“1”、“86”、“86”开头的手机号 3、手机号验证规则&#xff0c;1&#xff08;861&#xff0c;861&#xff09;开头的&#xff0c;第二位从3-9的11位数字&#xff08;除去86&#xff0c;86开头&#xff09; 百度到的正…

URL?后参数有特殊字符问题

前端对于URL的参数不做处理 不处理、用URLDecoder.decode()处理、用URLEncoder.encode()处理、用URLEncoder.encode()处理后再用URLDecoder.decode()处理 结果 前端对于URL的参数用encodeURIComponent(‘XF-OPPZZD-26*316’)处理 结果 前端不处理有&字符时 结果会把后…

BUUCTF---[极客大挑战 2019]BabySQL1

1.这道题和之前做的几道题是相似的&#xff0c;这道题考的知识点更多。难度也比之前的大一些 2.尝试万能密码 or 1#发现过滤了or,使用1和1,发现他对单引号也进行了过滤。于是我尝试进行双写绕过&#xff0c;发现可以通过了。 3.由之前的做题经验可知&#xff0c;这道题会涉及到…

【C#语言入门】10. 操作符详解(下)

【C#语言入门】10. 操作符详解&#xff08;下&#xff09; 四、各类操作符的示例 (T)x 强制类型转换符 //ushort的maxvalue是65535 uint x 65536; ushort y (ushort)x; Console.WriteLine(y);//结果为0类型转换 隐式&#xff08;implicit&#xff09;类型转换 不丢失精度的…

CMake的cmake_dependent_option用法

前言 本篇文章讲解CMake的cmake_dependent_option用法 选项和变量 在讲cmake_dependent_option之前&#xff0c;先讲一下CMake的选项和变量 选项 在CMake中&#xff0c;选项可以用来控制构建过程中的一些开关。我们可以使用option()命令来添加一个选项。option的函数原型如…

ChatGPT的安全警告

ChatGPT作为一种强大的人工智能模型&#xff0c;在提供便利的同时&#xff0c;确实存在一些安全隐患&#xff0c;需要引起我们的关注和重视。 首先&#xff0c;ChatGPT可能会提供不准确或虚假的信息。这主要源于其训练数据的多样性和复杂性&#xff0c;以及模型的自身局限性。…

每日汇评:黄金上破2161美元纪录高位,有可能进一步上涨?

周四早间&#xff0c;金价在2150美元的历史高点附近盘整&#xff0c;并成功上破2160历史高位&#xff1b; 美元在美债收益率的压力下逐步走低&#xff0c;市场期待更多鲍威尔讲话和美国就业数据&#xff1b; 日线图上的RSI指标超买状况继续令黄金买家保持谨慎&#xff1b; 金价…

中外联合培养工商管理博士|社科大新加坡社科大学中文授课DBA

中外联合培养工商管理博士|社科大新加坡社科大学中文授课DBA 全球经济正在经历由科技进步和创新、政治和人口剧烈变化所带来的巨大的不确定性和挑战。面对日趋复杂的外部竞争环境&#xff0c;企业的领导者和管理者需要具备卓越的战略思维和全球洞察力、以科学的精神和严谨务实的…

如何在手机上中恢复已删除的照片

市场上有大量用于恢复手机已删除照片的应用程序。您可以尝试任何合法的应用程序来恢复意外删除的视频。其中一些应用程序包括 奇客数据恢复、Disk Drill等。 恢复已删除的 Android 照片 如果您不小心从 Android 设备中删除了任何重要视频&#xff0c;无需惊慌。您可以按照这些…

2024中国(浙江)环保产业与水科技博览会

汇聚科技智慧力量&#xff0c;助力美丽中国建设 浙江省环境服务业高质量发展大会 2024中国&#xff08;浙江&#xff09;环保产业与水科技博览会 China (Zhejiang) environmental protection industry and Water Technology Expo I 环保产业 I 水利科技 I 智慧水务 I 泵管阀…