Go資深工程師講解(慕課) 007_godoc與代碼生成

Go 文檔生成與示例代碼

對應視頻 8-6 生成文檔和示例代碼

1. godoc 文檔生成

Go 的文檔直接從源碼註釋中提取,不需要特殊標記語法。

1.1 註釋規範

// Package queue 實現了一個簡單的 FIFO 隊列。
//
// 該隊列基於切片實現,支持 Push、Pop 和 IsEmpty 操作。
package queue

// Queue 代表一個整數先進先出隊列。
type Queue []int

// Push 將元素 v 添加到隊列尾部。
func (q *Queue) Push(v int) {
    *q = append(*q, v)
}

// Pop 移除並返回隊列頭部的元素。
// 如果隊列爲空,會 panic。
func (q *Queue) Pop() int {
    head := (*q)[0]
    *q = (*q)[1:]
    return head
}

// IsEmpty 返回隊列是否爲空。
func (q *Queue) IsEmpty() bool {
    return len(*q) == 0
}

規則:
- 註釋緊貼在聲明上方,以被註釋對象的名稱開頭
- 包註釋寫在 package 語句上方(或單獨的 doc.go 文件中)
- 空行分隔段落
- 縮進的文本會被當作代碼塊顯示

1.2 查看文檔

# 本地啓動 godoc 服務(Go 1.12 之前內置,之後需安裝)
go install golang.org/x/tools/cmd/godoc@latest
godoc -http :6060
# 瀏覽器訪問 http://localhost:6060

# 命令行查看
go doc fmt
go doc fmt.Println
go doc -all queue       # 查看包的所有文檔

1.3 pkg.go.dev

發佈到 GitHub 的包會自動在 pkg.go.dev 上生成文檔,無需額外操作。

2. Example 測試(可執行的文檔)

Example 函數既是文檔又是測試,寫在 _test.go 文件中:

// queue_test.go
package queue_test

import (
    "fmt"
    "myproject/queue"
)

// 包級別的示例
func Example() {
    q := queue.Queue{1}
    q.Push(2)
    q.Push(3)
    fmt.Println(q.Pop())
    fmt.Println(q.Pop())
    fmt.Println(q.IsEmpty())
    // Output:
    // 1
    // 2
    // false
}

// 方法級別的示例
func ExampleQueue_Push() {
    var q queue.Queue
    q.Push(1)
    q.Push(2)
    fmt.Println(q)
    // Output:
    // [1 2]
}

func ExampleQueue_IsEmpty() {
    var q queue.Queue
    fmt.Println(q.IsEmpty())
    q.Push(1)
    fmt.Println(q.IsEmpty())
    // Output:
    // true
    // false
}

命名規則

示例類型 函數名
包示例 Example()
函數示例 ExampleFuncName()
類型示例 ExampleTypeName()
方法示例 ExampleTypeName_MethodName()
多個示例 ExampleTypeName_MethodName_suffix()

Output 註釋

  • // Output: — 精確匹配輸出
  • // Unordered output: — 不關心輸出順序(適合 map 遍歷等)
  • 沒有 Output 註釋 → 只編譯不運行(僅檢查編譯通過)
# 運行示例測試
go test -v -run Example

運行 godoc 時,Example 函數會自動顯示在對應函數/類型的文檔頁面中,並且帶有可運行按鈕。

3. go generate

go generate 用於在編譯前運行代碼生成工具。

3.1 基本用法

在 Go 源文件中添加特殊註釋:

//go:generate stringer -type=Pill
package painkiller

type Pill int

const (
    Placebo Pill = iota
    Aspirin
    Ibuprofen
    Paracetamol
)
# 安裝 stringer 工具
go install golang.org/x/tools/cmd/stringer@latest

# 運行 generate(會執行文件中所有 //go:generate 指令)
go generate ./...

這會自動生成 pill_string.go,包含 Pill 類型的 String() 方法。

3.2 常見的 generate 用途

工具 用途
stringer 爲枚舉類型生成 String() 方法
mockgen 生成接口的 mock 實現
protoc 從 .proto 文件生成 Go 代碼
sqlc 從 SQL 生成類型安全的 Go 代碼
enumer 枚舉生成(比 stringer 更強)
go-bindata 將靜態資源嵌入二進制

3.3 Go 1.16+ embed(替代 go-bindata)

package main

import (
    "embed"
    "fmt"
    "net/http"
)

//go:embed static/*
var staticFiles embed.FS

//go:embed config.json
var config []byte

//go:embed version.txt
var version string

func main() {
    fmt.Println("Version:", version)
    fmt.Println("Config:", string(config))

    // 靜態文件服務
    http.Handle("/static/",
        http.FileServer(http.FS(staticFiles)))
    http.ListenAndServe(":8080", nil)
}

4. 總結

特性 說明
註釋即文檔 緊貼聲明上方的註釋自動成爲文檔
Example 測試 既是可運行的文檔,又是測試用例
go doc 命令行查看文檔
godoc -http 本地 Web 文檔服務
pkg.go.dev 公開包的在線文檔
go generate 編譯前的代碼生成
//go:embed 嵌入靜態資源到二進制(Go 1.16+)

主題測試文章,只做測試使用。發佈者:Walker,轉轉請注明出處:https://www.walker-learn.xyz/archives/6749

(0)
Walker的頭像Walker
上一篇 2026年3月6日 14:00
下一篇 2026年3月6日 13:00

相關推薦

  • Go工程師體系課 014

    rocketmq 快速入門 去我們的各種配置(podman)看是怎麼安裝的 概念介紹 RocketMQ 是阿里開源、Apache 頂級項目的分佈式消息中間件,核心組件: NameServer:服務發現與路由 Broker:消息存儲、投遞、拉取 Producer:消息生產者(發送消息) Consumer:消息消費者(訂閱並消費消息) Topic/Tag:主題/…

    後端開發 2026年3月6日
    7700
  • Go工程師體系課 001

    轉型 想在短時間系統轉到Go工程理由 提高CRUD,無自研框架經驗 拔高技術深度,做專、做精需求的同學 進階工程化,擁有良好開發規範和管理能力的 工程化的重要性 高級開的期望 良好的代碼規範 深入底層原理 熟悉架構 熟悉k8s的基礎架構 擴展知識廣度,知識的深度,規範的開發體系 四個大的階段 go語言基礎 微服務開發的(電商項目實戰) 自研微服務 自研然後重…

    後端開發 2026年3月6日
    7000
  • 編程基礎 0012_Go_Web與網絡編程精華

    Go Web 與網絡編程精華 知識來源:- 《Building Web Apps with Go》- 《Go API 編程》- 《Go Web 編程》(Go Web Programming, Sau Sheong Chang)- 《Go 網絡編程》(Network Programming with Go)- 《Mastering Go Web Service…

    後端開發 2026年3月6日
    7000
  • 日積月累 電子書目錄與推薦

    Go 語言電子書分類目錄與推薦 電子書來源目錄:/Users/walker/Downloads/www.zxit8.com_017—電子書/共計 48 份資料(47 個編號 PDF + 1 本獨立命名 Go語言實戰 + 1 份源碼 zip)整理時間:2026-03-06 本目錄對全部電子書按主題分類並給出推薦度評級,幫助讀者根據自身水平和需求選擇合適的學習材…

    後端開發 2026年3月7日
    7200
  • Go日積月累 電子書目錄與推薦

    Go 語言電子書精華整理與推薦 基於 48 份 Go 語言電子書資料,按主題提煉爲 4 篇系統化精華文檔。整理時間:2026-03-06 精華文章導讀 以下 4 篇文章從 48 份電子書中提煉核心知識,按主題系統化整理,覆蓋 Go 語言從底層原理到企業實戰的完整知識體系。 1. Go 底層原理與源碼精華 知識來源:《Go 源碼剖析》(雨痕)、《Go 1.4 …

    後端開發 2026年3月6日
    12600
簡體中文 繁體中文 English