日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Go語言中常用的開發(fā)神器

Go語言(或 Golang)起源于 2007 年,并在 2009 年正式對外發(fā)布。Go 是非常年輕的一門語言,它的主要目標是“兼具 Python 等動態(tài)語言的開發(fā)速度和 C/C++ 等編譯型語言的性能與安全性”。

成都創(chuàng)新互聯(lián)是專業(yè)的大廠網(wǎng)站建設(shè)公司,大廠接單;提供網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行大廠網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

Go語言是編程語言設(shè)計的又一次嘗試,是對類C語言的重大改進,它不但能讓你訪問底層操作系統(tǒng),還提供了強大的網(wǎng)絡(luò)編程和并發(fā)編程支持。Go語言的用途眾多,可以進行網(wǎng)絡(luò)編程、系統(tǒng)編程、并發(fā)編程、分布式編程。

單元測試

Java的單元測試需要使用第三方庫,一般是Junit,配置起來比較復(fù)雜。在使用了golang之后發(fā)現(xiàn)golang自帶的單元測試真的非常簡單。 如果我們有一個cal.go文件,那么其對應(yīng)的單元測試文件為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))
}

執(zhí)行單元測試只需要運行(更多用法參考go help test)

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

benchmark

和單元測試類似,golang的benchmark也是開箱即用。在cal_test.go基礎(chǔ)上增加一個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 

執(zhí)行即可(更多用法參考go help test)

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

pprof

pprof是golang自帶的可以用來做cpu、內(nèi)存、鎖分析的工具,非常類似java的async-profiler。 pprof的使用非常簡單,只需要在代碼中引入net/http/pprof包,然后監(jiān)聽一個端口即可。 一個簡單的例子如下:

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能采集到數(shù)據(jù),這里我的請求是

curl http://127.0.0.1:8000/hello

等待30秒后,采集結(jié)束會顯示采集文件的地址

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

此時可以使用top等命令直接查看cpu消耗過高的函數(shù),更多命令可以使用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在干啥


新聞標題:Go語言中常用的開發(fā)神器
文章來源:http://www.dlmjj.cn/article/ccdicjs.html