| <!--{ |
| "Title": "Godoc: documenting Go code", |
| "Template": true |
| }--> |
| |
| <p> |
| The Go project takes documentation seriously. Documentation is a huge part of |
| making software accessible and maintainable. Of course it must be well-written |
| and accurate, but it also must be easy to write and to maintain. Ideally, it |
| should be coupled to the code itself so the documentation evolves along with the |
| code. The easier it is for programmers to produce good documentation, the better |
| for everyone. |
| </p> |
| |
| <p> |
| To that end, we have developed the <a href="/cmd/godoc/">godoc</a> documentation |
| tool. This article describes godoc's approach to documentation, and explains how |
| you can use our conventions and tools to write good documentation for your own |
| projects. |
| </p> |
| |
| <p> |
| Godoc parses Go source code - including comments - and produces documentation as |
| HTML or plain text. The end result is documentation tightly coupled with the |
| code it documents. For example, through godoc's web interface you can navigate |
| from a function's <a href="/pkg/strings/#HasPrefix">documentation</a> to its |
| <a href="/src/pkg/strings/strings.go?#L312">implementation</a> with one click. |
| </p> |
| |
| <p> |
| Godoc is conceptually related to Python's |
| <a href="http://www.python.org/dev/peps/pep-0257/">Docstring</a> and Java's |
| <a href="http://www.oracle.com/technetwork/java/javase/documentation/index-jsp-135444.html">Javadoc</a>, |
| but its design is simpler. The comments read by godoc are not language |
| constructs (as with Docstring) nor must they have their own machine-readable |
| syntax (as with Javadoc). Godoc comments are just good comments, the sort you |
| would want to read even if godoc didn't exist. |
| </p> |
| |
| <p> |
| The convention is simple: to document a type, variable, constant, function, or |
| even a package, write a regular comment directly preceding its declaration, with |
| no intervening blank line. Godoc will then present that comment as text |
| alongside the item it documents. For example, this is the documentation for the |
| <code>fmt</code> package's <a href="/pkg/fmt/#Fprint"><code>Fprint</code></a> |
| function: |
| </p> |
| |
| {{code "/src/pkg/fmt/print.go" `/Fprint formats using the default/` `/func Fprint/`}} |
| |
| <p> |
| Notice this comment is a complete sentence that begins with the name of the |
| element it describes. This important convention allows us to generate |
| documentation in a variety of formats, from plain text to HTML to UNIX man |
| pages, and makes it read better when tools truncate it for brevity, such as when |
| they extract the first line or sentence. |
| </p> |
| |
| <p> |
| Comments on package declarations should provide general package documentation. |
| These comments can be short, like the <a href="/pkg/sort/"><code>sort</code></a> |
| package's brief description: |
| </p> |
| |
| {{code "/src/pkg/sort/sort.go" `/Package sort provides/` `/package sort/`}} |
| |
| <p> |
| They can also be detailed like the <a href="/pkg/encoding/gob/">gob package</a>'s |
| overview. That package uses another convention for packages |
| that need large amounts of introductory documentation: the package comment is |
| placed in its own file, <a href="/src/pkg/encoding/gob/doc.go">doc.go</a>, which |
| contains only those comments and a package clause. |
| </p> |
| |
| <p> |
| When writing package comments of any size, keep in mind that their first |
| sentence will appear in godoc's <a href="/pkg/">package list</a>. |
| </p> |
| |
| <p> |
| Comments that are not adjacent to a top-level declaration are omitted from |
| godoc's output, with one notable exception. Top-level comments that begin with |
| the word <code>"BUG(who)”</code> are recognized as known bugs, and included in |
| the "Bugs” section of the package documentation. The "who” part should be the |
| user name of someone who could provide more information. For example, this is a |
| known issue from the <a href="/pkg/bytes/#bugs">bytes package</a>: |
| </p> |
| |
| <pre> |
| // BUG(r): The rule Title uses for word boundaries does not handle Unicode punctuation properly. |
| </pre> |
| |
| <p> |
| Godoc treats executable commands somewhat differently. Instead of inspecting the |
| command source code, it looks for a Go source file belonging to the special |
| package "documentation”. The comment on the "package documentation” clause is |
| used as the command's documentation. For example, see the |
| <a href="/cmd/godoc/">godoc documentation</a> and its corresponding |
| <a href="/src/cmd/godoc/doc.go">doc.go</a> file. |
| </p> |
| |
| <p> |
| There are a few formatting rules that Godoc uses when converting comments to |
| HTML: |
| </p> |
| |
| <ul> |
| <li> |
| Subsequent lines of text are considered part of the same paragraph; you must |
| leave a blank line to separate paragraphs. |
| </li> |
| <li> |
| Pre-formatted text must be indented relative to the surrounding comment text |
| (see gob's <a href="/src/pkg/encoding/gob/doc.go">doc.go</a> for an example). |
| </li> |
| <li> |
| URLs will be converted to HTML links; no special markup is necessary. |
| </li> |
| </ul> |
| |
| <p> |
| Note that none of these rules requires you to do anything out of the ordinary. |
| </p> |
| |
| <p> |
| In fact, the best thing about godoc's minimal approach is how easy it is to use. |
| As a result, a lot of Go code, including all of the standard library, already |
| follows the conventions. |
| </p> |
| |
| <p> |
| Your own code can present good documentation just by having comments as |
| described above. Any Go packages installed inside <code>$GOROOT/src/pkg</code> |
| and any <code>GOPATH</code> work spaces will already be accessible via godoc's |
| command-line and HTTP interfaces, and you can specify additional paths for |
| indexing via the <code>-path</code> flag or just by running <code>"godoc ."</code> |
| in the source directory. See the <a href="/cmd/godoc/">godoc documentation</a> |
| for more details. |
| </p> |