いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-476 (ドキュメントコメントを扱う)(go/doc/commentパッケージ)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れないうちにメモメモ。。。

知らなかったのですが、go/doc/comment というパッケージがあるのですね。

Goのドキュメントコメント形式の文字列を解釈して、いろいろな形式に変換してくれるパッケージです。

面白そうだったので、少し試してみました。

サンプル

package main

import (
    "flag"
    "go/doc/comment"
    "log"
    "os"
)

const (
    sample = `
# Title

helloworld.

[path/filepath] package.

[io.Reader] interface.

code block
        package main
        func main(){}

list
        - a
        - b

[path/filepath]: https://pkg.go.dev/path/filepath@go1.23.1
[io.Reader]: https://pkg.go.dev/io@go1.23.1#Reader
`
)

type (
    Args struct {
        markdown bool
        html     bool
        comment  bool
        text     bool
    }
)

var (
    args Args
)

func init() {
    flag.BoolVar(&args.markdown, "md", false, "output markdown")
    flag.BoolVar(&args.html, "html", false, "output html")
    flag.BoolVar(&args.comment, "comment", false, "output go comment")
    flag.BoolVar(&args.text, "text", false, "output text")
}

func main() {
    log.SetFlags(0)
    flag.Parse()

    if err := run(); err != nil {
        log.Panic(err)
    }
}

func run() error {
    var (
        parser  comment.Parser
        printer comment.Printer
        doc     *comment.Doc
        buf     []byte
    )
    doc = parser.Parse(sample)
    printer.TextPrefix = "// "

    switch {
    case args.markdown:
        buf = printer.Markdown(doc)
    case args.html:
        buf = printer.HTML(doc)
    case args.comment:
        buf = printer.Comment(doc)
    case args.text:
        buf = printer.Text(doc)
    default:
        flag.PrintDefaults()
        return nil
    }

    if _, err := os.Stdout.Write(buf); err != nil {
        return err
    }

    return nil
}

実行すると以下のように出力されます。

$ task
task: [build] go build -o app .
task: [run] ./app -h
Usage of ./app:
  -comment
        output go comment
  -html
        output html
  -md
        output markdown
  -text
        output text
task: [run] ./app -md
### Title {#hdr-Title}

helloworld.

[path/filepath](https://pkg.go.dev/path/filepath@go1.23.1) package.

[io.Reader](https://pkg.go.dev/io@go1.23.1#Reader) interface.

code block

        package main
        func main(){}

list

  - a
  - b
task: [run] ./app -html
<h3 id="hdr-Title">Title</h3>
<p>helloworld.
<p><a href="https://pkg.go.dev/path/filepath@go1.23.1">path/filepath</a> package.
<p><a href="https://pkg.go.dev/io@go1.23.1#Reader">io.Reader</a> interface.
<p>code block
<pre>package main
func main(){}
</pre>
<p>list
<ul>
<li>a
<li>b
</ul>
task: [run] ./app -comment
# Title

helloworld.

[path/filepath] package.

[io.Reader] interface.

code block

        package main
        func main(){}

list
  - a
  - b

[path/filepath]: https://pkg.go.dev/path/filepath@go1.23.1
[io.Reader]: https://pkg.go.dev/io@go1.23.1#Reader
task: [run] ./app -text
// # Title
//
// helloworld.
//
// path/filepath package.
//
// io.Reader interface.
//
// code block
//
//      package main
//      func main(){}
//
// list
//   - a
//   - b

[path/filepath]: https://pkg.go.dev/path/filepath@go1.23.1
[io.Reader]: https://pkg.go.dev/io@go1.23.1#Reader

try-golang/examples/singleapp/doc_comment at main · devlights/try-golang · GitHub

参考情報

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。