本文面向golang的新手沦偎,第一次接觸golang時可能會吃驚的地方
1. 以大小寫開頭來決定一個聲明是包內(nèi)可見执庐,還是包外可見
如果一個常量/變量/類型/函數(shù) 它的名稱是小寫字母開頭映之,則它是一個內(nèi)部的,只能在同一個包內(nèi)訪問父款。
反之它是導出到外部的尾膊。
~/go/src/a.go
package a
import “b”
var name = b.lower // error
var name = b.Upper // correct
~/go/src/b.go
package b
const lower = “l(fā)ower”
const Upper = “Upper”
2. 函數(shù)支持多返回值。
resp, err := http.Get(url)
對于那些將運行失敗看作是預期結(jié)果的函數(shù)络凿,它們會返回一個額外的返回值骡送,通常是最后一個,來傳遞錯誤信息絮记。如果導致失敗的原因只有一個摔踱,額外的返回值可以是一個布爾值,通常被命名為ok
導致失敗的原因不止一種怨愤,尤其是對I/O操作而言派敷,用戶需要了解更多的錯誤信息。因此撰洗,額外的返回值不再是簡單的布爾類型篮愉,而是error類型
io包保證任何由文件結(jié)束引起的讀取失敗都返回同一個錯誤——io.EOF,
3. 示例函數(shù)
go中Example開頭的函數(shù)都是示例函數(shù)差导,示例函數(shù)要被編譯以檢測程序是否有問題试躏,示例也會被go放到doc中
4. set
set是用map來實現(xiàn)的 map[string]bool
也可用bitmap來做
示例用bitmap實現(xiàn)整數(shù)集
5. Package
本來go的模塊也比較神奇,所有新建的工程都要放到GOPATH/src下面设褐,不能隨便找個目錄就創(chuàng)建颠蕴,但后來發(fā)現(xiàn)1.11之后的go mod還比較正常,好用助析。
6. 測試
沒有斷言犀被,全是手動比較,然后用t.Error("xxx")自己寫測試和你期望不一樣的地方外冀,書上給的解譯是這樣的:
許多Go語言新人會驚異于Go語言極簡的測試框架寡键。很多其它語言的測試框架都提供了識別測試函數(shù)的機制(通常使用反射或元數(shù)據(jù)),通過設置一些“setup”和“teardown”的鉤子函數(shù)來執(zhí)行測試用例運行
的初始化和之后的清理操作锥惋,同時測試工具箱還提供了很多類似assert斷言昌腰、值比較函數(shù)、格式化輸出錯誤信息和停止一個失敗的測試等輔助函數(shù)(通常使用異常機制)膀跌。雖然這些機制可以使得測試非常
簡潔遭商,但是測試輸出的日志卻會像火星文一般難以理解。此外捅伤,雖然測試最終也會輸出PASS或FAIL的報告劫流,但是它們提供的信息格式卻非常不利于代碼維護者快速定位問題,因為失敗信息的具體含義非
常隱晦,比如“assert: 0 == 1”或成頁的海量跟蹤日志祠汇。Go語言的測試風格則形成鮮明對比仍秤。它期望測試者自己完成大部分的工作,定義函數(shù)避免重復可很,就像普通編程那樣诗力。編寫測試并不是一個機械的填空過程;一個測試也有自己的接口我抠,盡管它的維護者也
是測試僅有的一個用戶苇本。一個好的測試不應該引發(fā)其他無關的錯誤信息,它只要清晰簡潔地描述問題的癥狀即可菜拓,有時候可能還需要一些上下文信息瓣窄。在理想情況下,維護者可以在不看代碼的情況下就能
根據(jù)錯誤信息定位錯誤產(chǎn)生的原因纳鼎。一個好的測試不應該在遇到一點小錯誤時就立刻退出測試俺夕,它應該嘗試報告更多的相關的錯誤信息,因為我們可能從多個失敗測試的模式中發(fā)現(xiàn)錯誤產(chǎn)生的規(guī)律贱鄙。