Go语言中常用的开发神器

Go语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。

Go语言是编程语言设计的又一次尝试,是对类C语言的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。Go语言的用途众多,可以进行网络编程、系统编程、并发编程、分布式编程。

单元测试

Java的单元测试需要使用第三方库,一般是Junit,配置起来比较复杂。在使用了golang之后发现golang自带的单元测试真的非常简单。 如果我们有一个cal.go文件,那么其对应的单元测试文件为cal_test.go,其中的方法命名必须为TestXxx,这种按照命名进行单元测试的方式简单有效,也正是通常所说的“约定大于配置”。 来看一个简单的例子:

package unit

func add(a int, b int) int {
  return a + b
}

func sub(a int, b int) int {
  return a - b
}
package unit

import (
   "github.com/stretchr/testify/assert"
   "testing"
)

func TestAdd(t *testing.T) {
   assert.Equal(t, 10, add(5, 5))
}

func TestSub(t *testing.T) {
   assert.Equal(t, 0, sub(5, 5))
}

执行单元测试只需要运行(更多用法参考go help test)

go test --cover cal_test.go cal.go -v

benchmark

和单元测试类似,golang的benchmark也是开箱即用。在cal_test.go基础上增加一个BenchmarkAdd方法

package unit

import (
  "github.com/stretchr/testify/assert"
  "testing"
)

func TestAdd(t *testing.T) {
  assert.Equal(t, 10, add(5, 5))
}

func TestSub(t *testing.T) {
  assert.Equal(t, 0, sub(5, 5))
}

func BenchmarkAdd(b *testing.B) {
  for i:= 0; i 

执行即可(更多用法参考go help test)

go test -bench=. -cpu=4 -count=3

pprof

pprof是golang自带的可以用来做cpu、内存、锁分析的工具,非常类似java的async-profiler。 pprof的使用非常简单,只需要在代码中引入net/http/pprof包,然后监听一个端口即可。 一个简单的例子如下:

package main

import (
   "fmt"
   "log"
   "net/http"
   "time"
   _ "net/http/pprof"
)

func main() {
   go func() {
       //example: visit http://127.0.0.1:6060/debug/pprof in browser.
       err := http.ListenAndServe("0.0.0.0:6060", nil)
       if err != nil {
           fmt.Println("failed to start pprof goroutine:", err)
       }
   }()

   http.HandleFunc("/", handler)
   log.Fatal(http.ListenAndServe("localhost:8000", nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
   time.Sleep(1 * time.Second)
   eat()
   time := time.Now().Unix() * 2 + 1000000
   fmt.Fprintf(w, "URL.Path = %q; time = %d\n", r.URL.Path, time)
}

func eat() {
   loop := 10000000000
   for i := 0; i do nothing
   }
}

在命令行中输入

go tool pprof http://127.0.0.1:6060/debug/pprof/profile

同时不停的请求,让pprof能采集到数据,这里我的请求是

curl http://127.0.0.1:8000/hello

等待30秒后,采集结束会显示采集文件的地址

Saved profile in /Users/roshi/pprof/pprof.samples.cpu.003.pb.gz

此时可以使用top等命令直接查看cpu消耗过高的函数,更多命令可以使用help查看。

或者把文件下载下来用可视化的界面来分析,可以使用

go tool pprof -http=":8080" /User/roshi/pprof/pprof.samples.cpu.003.pb.gz

来开启一个可视化的页面,查看,如果报错需要安装graphviz,安装文档在这里可以查找:https://graphviz.gitlab.io/download/

访问 http://localhost:8080/ui/ 可以看到下图,其中面积最大的块表示消耗cpu最多

这里有一篇文章对pprof介绍的很仔细,可以参考:https://blog.wolfogre.com/posts/go-ppof-practice/

dlv

pprof很好用,但有一个缺点是必须事先在代码中开启,如果线上出问题且没有开启pprof,可能就需要类似jstack、jmap、arthas等这类工具来排查。这里推荐一个最近使用过非常好用的golang问题排查利器——dlv,项目地址见

https://github.com/go-delve/delve

它很有用的一个功能是attach,可以attach到正在运行的golang程序,查看goroutine。这点可以很好的排查线上问题。 各个平台的安装在github上写的很清楚,需要说明的是安装dlv的golang版本和要排查进程的golang版本需要保持一致。 先写一个测试程序,起两个goroutine,一个运行,一个阻塞

package main

import (
  "fmt"
  "sync"
)

func main()  {
  go count()
  go wait()
  wait()
}

func count()  {
  count := 0
  for {
     count = count + 1
     if count % 1000000000 == 0 {
        fmt.Println("I'm a running routine")
     }
  }
}

func wait()  {
  wg := sync.WaitGroup{}
  wg.Add(1)
  wg.Wait()
}

运行起来,然后使用dlv进行attach,如下图(具体命令可以attach后使用help查看)

这样很方便地看到了各个goroutine在干啥

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/224030.html<

(0)
运维的头像运维
上一篇2025-04-16 06:00
下一篇 2025-04-16 06:02

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注