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://walker-learn.xyz/archives/6749

(0)
Walker的头像Walker
上一篇 14小时前
下一篇 1天前

相关推荐

  • 编程基础 0003_Web_beego开发

    Web 开发之 Beego 使用 go get 安装 bee 工具与 beego Bee Beego 使用 bee 工具初始化 Beego 项目 在$GOPATH/src 目录下执行 bee create myapp 使用 bee 工具热编译 Beego 项目 在$GOPATH/src/myapp 目录下执行 bee start myapp // hello…

    后端开发 17小时前
    500
  • Go工程师体系课 003

    grpc grpc grpc-go grpc 无缝集成了 protobuf protobuf 习惯用 Json、XML 数据存储格式的你们,相信大多都没听过 Protocol Buffer。 Protocol Buffer 其实是 Google 出品的一种轻量 & 高效的结构化数据存储格式,性能比 Json、XML 真的强!太!多! protobuf…

    后端开发 14小时前
    500
  • 编程基础 0001_基础教程

    go 什么是 Go是一门并发支持、垃圾加收的编译型系统编程语言,具有静态编译语言的高性能和动态语言的,主要特点如下 类型安全和内存安全 以非常直观和极低代价的方案实现高并发 高效的垃圾回收机制 快速编译(同时解决了 C 语言中头文件太多的问题) UTF-8 支持 安装 源码安装 标准包安装 第三方安装 标准包安装,一路下一步。安装完后,会自动添加如下环境变量…

    后端开发 16小时前
    900
  • Go工程师体系课 002

    GOPATH 与 Go Modules 的区别 1. 概念 GOPATH 是 Go 的早期依赖管理机制。 所有的 Go 项目和依赖包必须放在 GOPATH 目录中(默认是 ~/go)。 一定要设置 GO111MODULE=off 项目路径必须按照 src/包名 的结构组织。 不支持版本控制,依赖管理需要手动处理(例如 go get)。 查找依赖包的顺序是 g…

    15小时前
    400
  • Go工程师体系课 019

    Go 内存模型与 GC 1. 内存分配基础 1.1 栈(Stack)与堆(Heap) ┌─────────────────────────────┐ │ 堆 (Heap) │ ← 动态分配,GC 管理 │ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │ obj │ │ obj │ │ obj │ │ │ └─────┘ └─────┘ └────…

简体中文 繁体中文 English