go 自动文档生成 如何写高大上的 godoc(Go 文档)

news/2024/10/18 16:41:52/

做 Go 开发时,我们在开源项目的主页上我们经常可以看到这样的一个徽章:

 

 

点击徽章,就可以打开 godoc.org 的网页,网页中给出了这个开源项目所对应的 Go 文档。作为 Go 语言的新手,我一度以为,godoc.org 上面的文档是需要开发者上传并审核的——要不然那些文档咋都显得那么专业呢。

然而当我写自己的轮子时,慢慢的我就发现并非如此。划重点:在 godoc.org 上的文档,都是 Go 自动从开源项目的工程代码中搜集、格式化后展现出来的。换句话说,每个人都可以写自己的 godoc 并且展示在 godoc.org 上,只需要遵从 godoc 的格式标准即可,也不需要任何审核动作。

本文章的目的是通过例子,简要说明 godoc 的格式,让读者也可以自己写一段高大上的 godoc。以下内容以我自己的 jsonvalue 仓库为例子。其对应的 godoc 在这里。读者可以点开,并与代码中的内容做参考对比。

本文地址:https://cloud.tencent.com/developer/article/1526609

什么是 godoc

顾名思义,godoc 就是 Go 语言的文档。在实际应用中,godoc 可能可以指以下含义:

  1. https://godoc.org 中的内容
  2. Go 开发工具安装之后,自带的一个命令,就叫做 godoc
  3. Go 工具包的文档以及生成该文档所相关的格式

我们从 Go 自带的 godoc 工具讲起吧。前面我们说到的 godoc.org,是 Go 最为官方的文档网站。其中我们可以查阅 Go 原生 package 的文档说明。而 godoc 命令的作用,则是可以让我们在本地建立一个属于自己的 godoc 网站服务(官方的 godoc 其实也基本上是用同一个工具建立起来的)。

自建的 godoc 有两个作用,一是解决某局域网内无法访问 godoc.org 的尴尬,另一个则是可以本地调试自己的文档。

我们可以用下面的命令在本地启动自己的 godoc 服务:

godoc -http=127.0.0.1:6060 -play

或者简写为:

godoc -http=:6060 -play

在浏览器输入 http://127.0.0.1:6060 之后,就可以看到熟悉的 Go 文档页面了:

 

原理上,godoc 读取的包路径来自于 $GOROOT。因此,如果你要让本地的 godoc 认识并解析你自己的开发包,就应该在 $GOROOT 目录下按照路径结构放好自己的工程代码——软链接也是支持的。比如笔者的 jsonvalue 包,我放在了这个路径下:~/project/github.com/Andrew-M-C/go.jsonvalue,于是我就在 $GOROOT 下建了软链接:

$ go env | grep GOROOT | sed 's/GOROOT=//g' | xargs cd
$ ln -s ~/project/github.com ./

然后在浏览器中输入 http://127.0.0.1:6060/pkg/github.com/Andrew-M-C/go.jsonvalue/,就可以看到和 godoc.org 一样的页面了。

godoc 一览

Go 秉承 “注释即文档” 的理念,符合 godoc 的文档均从 Go 代码中提取并生成。我们还是从 jsonvalue 的 godoc 来看,一个一个说明。在 godoc 中,文档包含三大部分:

 组成

 作用

Overview 总览

包含包的 import 语句和概要说明

Index 目录

包含包中可见性为 public 的常量、类型、方法、函数的总目录及说明

Examples 示例

包含文档中所有示例的快速跳转

Files 文件

列出了包中所有代码文件的超链接

其中第四部分无关紧要。下面我们按顺序说明前三部分

godoc 的 Overview

Package jsonvalue 的 Overview 部分包含了三部分内容:

  • import 语句
  • 文字说明
  • 代码部分

其中 import 部分是 godoc 自动按照 URL 生成的,这个不用管。至于文字部分和代码部分,godoc 都是从源码中提取出来的。提取的原则是:

  • 在代码中所有 package jsonvalue 语句中,找到其上方紧跟着的 // jsonvalue XXX 或者是 /* jsonvalue XXX */ 注释块
  • 注释块可以有多行,但必须是连续的 // 或者 /* XXX */ 开头。如果需要换行,则留一行空注释
  • 如果找到多个符合条件的注释,则按照文件字母序显示——建议把 Overview 放在一个注释块中,而不要分散撰写。

比如 jsonvalue 的 Overview 说明,统一放在 doc.go 中,这个文件中只有 package jsonvalue 语句以及包说明——这也是不少文章中推荐的做法。

Overview 的文字部分

请读者打开 doc.go,然后对比 godoc,就可以对照着看到文字部分是怎么被 godoc 呈现出来的。

Overview 的代码部分

在注释中,如果在 // 后面的注释文本中,如果以 tab 进行了锁进,那么 godoc 会将这一行视为代码块。比如下面这一段:

 

其中 "As a quick start:" 行的左边分别为:两个斜杠 + 一个空格。这一行,godoc 视为普通文字;而其余部分的左边为:两个斜杠 + 一个空格 + 一个tab,被 godoc 视为代码部分。于是我们在 godoc 网页上,就可以看到这样的显示结果了:

 

godoc 的代码文档

godoc 工具会搜寻代码中所有源码文件(自测文件除外),然后展示到页面上。搜索的依据如下:

  • 搜寻对象是代码中所有的公共部分,包括常量、变量、接口、类型、函数
  • 与 Overview 类似,紧跟着一个公共元素的、以该元素开头的注释段,会被 godoc 视为该元素的注释
  • 换行逻辑和代码块逻辑的处理也与 Overview 相同

不过在源码说明中,更多的采用代码示例来说明逻辑,因此在这一环节中,代码块比较少用。

这里我用 jsonvalueAt() 函数为例。在代码中,对于 Set() 函数我是这么写的(请无视我蹩脚的英文):

// At completes the following operation of Set(). It defines posttion of value in Set() and return the new value set.
//
// The usage of At() is perhaps the most important. This function will recursivly search for child value, and set the new value specified by Set() or SetXxx() series functions. Please unfold and read the following examples, they are important.
func (s *Set) At(firstParam interface{}, otherParams ...interface{}) (*V, error) {......
}

godoc 解析并格式化效果如下:

 

godoc 的代码示例

读者可以注意到,在我的 At() 函数下,除了上文提到的文档正文之外,还有五个代码示例。那么,文档中的代码示例又应该如何写呢?

首先,我们应该新建至少一个文件,专门用来存放示例代码。比如我就把示例代码写在了 example_jsonvalue_test.go 文件中。这个文件的 package 名也不得与当前包名相同,而应该命名为 包名_test 的格式。

示例代码的声明

如何声明一个示例代码,这里我举两个例子。首先是在 At() 函数下名为 “Example (1)” 的示例。在代码中,我把这个函数命名为:

func ExampleSet_At_1() {......
}

这个函数命名有几个部分:

 函数名组成部分

  说明

Example

这是示例代码的固有开头

Set

表示这是类型 Set 的示例

第一个下划线 _

分隔符,在这个分隔符后面的,是 Set 类型的成员函数名

At

表示这是函数 At() 的示例,搭配前面的内容,则表示这是类型 Set 的成员函数 At() 的示例

第二个下划线 _

分隔符,在这个分隔符后面的内容,是示例代码的额外说明

1

这是示例代码的额外说明,也就是前面 “Example (1)” 括号里的部分

另外,示例代码中应该包含标准输出内容,这样便于读者了解执行情况。标准输出内容在函数内的最后,采用 // Output: 单独起一行开头,剩下的每一行标准输出写一行注释。

相对应地,如果你想要给(不属于任何一个类型的)函数写示例的话,则去掉上文中关于 “类型” 的字段;如果你不需要示例的额外说明符,则去掉 “额外说明” 字段。比如说,我给类型 Opt 写的示例就只有一个,在代码中,只有一行:

func ExampleOpt() {........
}

甚至连示例说明都没有。

如果一个元素包含多个例子,那么 godoc 会按照字母序对示例及其相应的说明排序。这也就是为什么我干脆在 At() 函数中,示例标为一二三四五的原因,因为这是我希望读者阅读示例的顺序。

在官网上发布 godoc

好了,当你写好了自己的 godoc 之后,总不是自己看自己自娱自乐吧,总归是要发布出来给大家看的。

其实发布也很简单:当你将包含了 godox 的代码 push 之后(比如发布到 github 上),就可以在浏览器中输入 https://godoc/org/${package路径名}。比如 jsonvalue 的 Github 路径(也等同于 import 路径)为 github.com/Andrew-M-C/go.jsonvalue,因此输入 godoc.org/github.com/Andrew-M-C/go.jsonvalue

如果这是该页面第一次进入,那么 godoc.org 会首先获取、解析和更新代码仓库中的文档内容,并且格式化之后展示。在页面的底部,会列出该 godoc 的更新时间。

 

如果你发现官网上的 godoc 内容已经落后了,那么可以点 “Refresh now” 链接刷新它。

接下来更重要的是,把这份官网 godoc 的链接,附到你自己的 README 中。还是点上图的 “Tools” 链接,就可以在新页面中,看到相应的 godoc 徽标的链接了。有 htmlmarkdown 格式任君选择。

 


http://www.ppmy.cn/news/733512.html

相关文章

生物医学信号检测与处理2——生物传感器——2酶传感器+酶联免疫吸附分析法ELISA(部分)——第二次课学习笔记

酶传感器酶联免疫吸附分析法ELISA(部分) 1 课程重点概况2 重点内容梳理2.1 酶生物传感器2.1.1 酶传感器的检测原理2.1.2 酶的固定技术2.1.2.1 聚合物包埋2.1.2.2 表面吸附2.1.2.3 共价结合2.1.2.4 静电相互作用2.1.2.5 特定的共价作用2.1.2.6 生物特异性…

如何写高大上的 godoc(Go 文档)

godoc 命令和 golang 代码文档管理 https://www.jianshu.com/p/b9ce0cbaabd5 介绍 godoc 是 golang 自带的文档查看器,更多的提供部署服务go doc 和 godoc 在 golang 1.13 被移除了,可以自行安装 golang.org go1.13 godoc go get golang.org/x/tools…

【React...归纳】

React...归纳 npm不同版本 Nginx前端性能优化浏览器引擎分类事件对象同源浏览器内核属性用户行为对浏览器缓存的影响 CSRF/XSSCC攻击HTTP/HTTPSHTTP请求报文HTTP协议交互原理TLS组成部分http请求方法幂等操作http头部字段权重q-valuesgzip编码 WebSocketprompt组件Chrome DevTo…

视频图像批量处理脚本

1.单个文件夹下对图像进行批量裁剪 from PIL import Image import osdef update(input_img_path, output_img_path):image Image.open(input_img_path)cropped image.crop((38, 0, 580, 610)) # 裁剪坐标为 (x0, y0, x1, y1)cropped.save(output_img_path)dataset_dir XXX…

linux 更改文件格式

1.chmod 数字 文件名;r代表4 w代表2 x 代表1 ;要变更文件格式首先要文件属性为e- 。 2.还有一种方式也可以改文件格式。u,g,o分别代表用户,组,其他用户. 3. u,g,o可加“”可减“-”可等于“” 转载于:https://www.cnblogs.c…

win10系统修改文件后缀名

以.txt修改为.ini为例 win10系统不能直接看文件后缀名。我在安装SQL的时候需要添加一个后缀名为“.ini”的文件,捣鼓了半天,终于改好啦!分享给大家,可能不是最便捷的,但是有亲测有效! 1.桌面新建一个文件…

如何更改文件后缀名

百度经验 > 游戏/数码 > 电脑 > 电脑软件 文件扩展名文件后缀名怎么显示怎么改 听语音 原创|浏览:75033|更新:2018-03-03 17:46

修改文件默认打开方式

对着文件右击->属性 打开方式点击更改 这样就可以修改某一类文件的打开方式