go doc 註解即文件


如果你想查詢套件、函式等的說明,可以使用 go doc 指令。

查詢文件

如果你想要查詢套件的文件說明,可以使用 go doc packageName,例如 go doc fmt 可查詢 fmt 套件的說明,

go doc

可以看到,這顯示了整個套件的說明,通常我們會想要查詢套件中某個函式,這可以使用 go doc packageName.funcName,例如,查詢 fmt 中的 Println,可以使用 go doc fmt.Println

go doc

你也可以加上 -src 來查詢原始碼,雖然整個套件也可以查詢,不過我想,這直接開 Go 目錄的 src 中原始碼來看比較快,或許加上 -src 的機會,會是在查詢函式的原始碼時比較多:

go doc

如同 go xxx 的指令說明,想要得到 go doc 的說明,可以使用 go help doc 指令。

go doc

註解即文件

實際上,go doc 的文件說明來自於原始碼中的註解,這樣的概念有點類似 Java 的 JavaDoc,或者是 Python 的 DocString,不過 Go 的理念是讓它更簡單,不使用特殊標記,不使用特別的格式,希望可以在沒有 go doc 的場合中,也可以藉由閱讀原始碼中的註解,輕易地得到文件說明。

當然,基本上還是要有一些約定,例如,在函式之前,緊接著函式的註解,中間沒有空白行,就是函式的文件說明來源。

類似地,在套件之前,緊接著套件的註解,就是套件的文件說明來源,通常,一個套件的文件說明,會是來自於套件中,一個 doc.go 中 package 宣告前的註解,例如,你可以在 fmt 的原始碼目錄 中,找到一個 doc.go,其中除了 package fmt 之外,沒有任何原始碼,剩下的只有註解。

除了函式、套件之外,最頂層的型態宣告、變數、常數等前緊接著的註解,都可以是文件的來源,不相鄰的註解則會被 godoc 忽略,如果有已知的 Bug,可以使用 BUG() 標示,例如 bytes.go 中有個:

// BUG(rsc): The rule Title uses for word boundaries does not handle Unicode punctuation properly.
func Title(s []byte) []byte {
    ....

這會出現在文件的 Bugs 區段

如果你想要從註解產生 HTML 文件(使用 -html 引數),那麼有幾個簡單的規則(用過 Markdown 的應該感覺有點熟悉),參考一下 Go 的原始碼,應該能很快地掌握。

基本上,go doc 會在 GOROOTGOPATH 中的原始碼查詢註解作為文件,如果想改變查詢時的 Go 目錄,可以使用 -goroot 指定。

有關註解與文件間的關係,也可以進一步參考 Effective Go 的 Commentary

godoc 文件伺服器

Go 1.2rc1 之後,曾經從 go doc 改用 godoc 指令了,不過,從 Go 1.5 Release Notes 中看到,Go 1.5 有個新的 go doc 指令,專門用於命令列模式下的文件查詢,這使得 godoc 主要剩下文件服器的功能,因而在 Go 1.13 中,godoc 被移除。

如果在一個網路受限的環境,又想要在網頁上查詢文件,還是可以安裝 godoc

go get -u golang.org/x/tools/cmd/godoc

這時執行 bin 中的 godoc,並附帶一個 -http 引數指定連接埠,例如,./bin/godoc -http=:6060,這會在本機啟動一個 HTTP 伺服器,使用瀏覽器連接 http://localhost:6060(或 http://主機IP:6060)就可以查詢文件:

godoc