咱們常常會看到不少程序員大部分的"編程"時間都花費在檢查bug和修復bug上。不管你是在編寫修改代碼仍是重構系統,幾乎都是花費大量的時間在進行故障排除和測試,外界都以爲咱們程序員是設計師,可以把一個系統從無作到有,是一項很偉大的工做,並且是至關有趣的工做,但事實上咱們天天都是徘徊在排錯、調試、測試之間。固然若是你有良好的習慣和技術方案來直面這些問題,那麼你就有可能將排錯時間減到最少,而儘量的將時間花費在更有價值的事情上。git
可是遺憾的是不少程序員不肯意在錯誤處理、調試和測試能力上下工夫,致使後面應用上線以後查找錯誤、定位問題花費更多的時間。因此咱們在設計應用以前就作好錯誤處理規劃、測試用例等,那麼未來修改代碼、升級系統都將變得簡單。程序員
Go語言主要的設計準則是:簡潔、明白,簡潔是指語法和C相似,至關的簡單,明白是指任何語句都是很明顯的,不含有任何隱含的東西,在錯誤處理方案的設計中也貫徹了這一思想。咱們知道在C語言裏面是經過返回-1或者NULL之類的信息來表示錯誤,可是對於使用者來講,不查看相應的API說明文檔,根本搞不清楚這個返回值究竟表明什麼意思,好比:返回0是成功,仍是失敗,而Go定義了一個叫作error的類型,來顯式表達錯誤。在使用時,經過把返回的error變量與nil的比較,來斷定操做是否成功。github
Go在錯誤處理上採用了與C相似的檢查返回值的方式,而不是其餘多數主流語言採用的異常方式,這形成了代碼編寫上的一個很大的缺點:錯誤處理代碼的冗餘,對於這種狀況是咱們經過複用檢測函數來減小相似的代碼。golang
在程序設計中,容錯是至關重要的一部分工做,在Go中它是經過錯誤處理來實現的,error雖然只是一個接口,可是其變化卻能夠有不少,咱們能夠根據本身的需求來實現不一樣的處理web
開發程序過程當中調試代碼是開發者常常要作的一件事情,Go語言不像PHP、Python等動態語言,只要修改不須要編譯就能夠直接輸出,並且能夠動態的在運行環境下打印數據。固然Go語言也能夠經過Println之類的打印數據來調試,可是每次都須要從新編譯,這是一件至關麻煩的事情。咱們知道在Python中有pdb/ipdb之類的工具調試,Javascript也有相似工具,這些工具都可以動態的顯示變量信息,單步調試等。不過慶幸的是Go也有相似的工具支持:GDB。Go內部已經內置支持了GDB,因此,咱們能夠經過GDB來進行調試,那麼本小節就來介紹一下如何經過GDB來調試Go程序。編程
另外建議純go代碼使用delve能夠很好的進行Go代碼調試併發
GDB是FSF(自由軟件基金會)發佈的一個強大的類UNIX系統下的程序調試工具。使用GDB能夠作以下事情:app
啓動程序,能夠按照開發者的自定義要求運行程序。
可以讓被調試的程序在開發者設定的調置的斷點處停住。(斷點能夠是條件表達式)
當程序被停住時,能夠檢查此時程序中所發生的事。
動態的改變當前程序的執行環境。
目前支持調試Go程序的GDB版本必須大於7.1。框架
編譯Go程序的時候須要注意如下幾點函數
傳遞參數-ldflags "-s",忽略debug的打印信息
傳遞-gcflags "-N -l" 參數,這樣能夠忽略Go內部作的一些優化,聚合變量和函數等優化,這樣對於GDB調試來講很是困難,因此在編譯的時候加入這兩個參數避免這些優化。
開發程序其中很重要的一點是測試,咱們如何保證代碼的質量,如何保證每一個函數是可運行,運行結果是正確的,又如何保證寫出來的代碼性能是好的,咱們知道單元測試的重點在於發現程序設計或實現的邏輯錯誤,使問題及早暴露,便於問題的定位解決,而性能測試的重點在於發現程序設計上的一些問題,讓線上的程序可以在高併發的狀況下還能保持穩定。本小節將帶着這一連串的問題來說解Go語言中如何來實現單元測試和性能測試。
Go語言中自帶有一個輕量級的測試框架testing和自帶的go test命令來實現單元測試和性能測試,testing框架和其餘語言中的測試框架相似,你能夠基於這個框架寫針對相應函數的測試用例,也能夠基於該框架寫相應的壓力測試用例,那麼接下來讓咱們一一來看一下怎麼寫。
gotest_test.go:這是咱們的單元測試文件,可是記住下面的這些原則:
壓力測試用來檢測函數(方法)的性能,和編寫單元功能測試的方法相似,此處再也不贅述,但須要注意如下幾點:
壓力測試用例必須遵循以下格式,其中XXX能夠是任意字母數字的組合,可是首字母不能是小寫字母
func BenchmarkXXX(b *testing.B) { ... }
文件名也必須以_test.go結尾
咱們能夠看到testing包很輕量,編寫單元測試和壓力測試用例很是簡單,配合內置的go test命令就能夠很是方便的進行測試,這樣在咱們每次修改完代碼,執行一下go test就能夠簡單的完成迴歸測試了。
這也許對於你編寫程序邏輯沒有任何幫助,可是對於你編寫出來的程序代碼保持高質量是相當重要的,由於一個好的Web應用一定有良好的錯誤處理機制(錯誤提示的友好、可擴展性)、有好的單元測試和壓力測試以保證上線以後代碼可以保持良好的性能和按預期的運行。