コメント(// と /* */)
『Go』のコメントは『//』による一行コメントと『/* */』によるブロックコメントの2種類があります。Goのドキュメントコメントは特別なタグを使わず、通常の『//』を宣言の直前に書くだけです。この形式を標準ツール『go doc』や『godoc』が解析してドキュメントを生成します。慣習として、コメントの最初の文が要約文になるよう書きます。
構文
// 一行コメント — // から行末までがコメントになります。
var x int = 10 // 行末コメント — コードの後にも書けます。
/*
ブロックコメント — /* から */ までの範囲がコメントになります。
複数行にわたるコメントや、コードブロックのコメントアウトに使います。
*/
// ExampleFunc は直後の関数を文書化するコメントです。
// 宣言の直前に /* */ ではなく // で書くのが Go の慣習です。
// コメントは宣言名から始めるのが慣習です("ExampleFunc は...")。
func ExampleFunc() {}
// Package math は数学ユーティリティを提供します。
// パッケージコメントはパッケージ宣言の直前に書きます。
package math
コメントの種類
| 種類 | 書き方 | 概要 |
|---|---|---|
| 一行コメント | // テキスト | 『//』から行末までがコメントになります。ドキュメントコメントを含め、最も多く使います。 |
| ブロックコメント | /* テキスト */ | 複数行にまたがるコメントや、一時的なコメントアウトに使います。ドキュメントコメントとしては使いません。 |
| ドキュメントコメント | // 宣言名 から始める | 宣言の直前に書く『//』コメントがそのままドキュメントになります。go doc / godoc が解析します。 |
| パッケージコメント | // Package 名前 から始める | package宣言の直前に書きます。『// Package 名前』で始めるのが慣習です。パッケージ全体の概要を記述します。 |
ドキュメントコメントの慣習
Goのドキュメントコメントは特別なタグがなく、書き方の慣習でドキュメント品質が決まります。標準ライブラリのコメントスタイルが参考になります。
| 慣習 | 説明 |
|---|---|
| 宣言名から始める | 「ExampleFunc はXXを...」のように宣言名で始めると、go doc での一覧表示や grep での検索が容易になります。 |
| 最初の文が要約 | godoc は最初の文をインデックスページの要約として表示します。最初の文だけを読んでも意味が通るように書きます。 |
| // Package 名前 で始める | パッケージコメントは『// Package math は...』のように始めるのが慣習です。 |
| 宣言と空行を挟まない | コメントと宣言の間に空行があるとドキュメントコメントとして認識されません。 |
| Examples 関数 | 『Example』で始まる関数(例: func ExampleFoo())は go test でドキュメントテストとして実行されます。 |
『go doc』コマンドでパッケージ・型・関数のドキュメントを表示できます。
go doc fmt go doc fmt.Println go doc -all math
コメントを書くべき場所・書かなくてよい場所
| 判断 | 場面 | 理由 |
|---|---|---|
| 書くべき | 「なぜこう実装したか」の理由 | コードを読むだけではわからない設計意図やトレードオフを残しておくと、将来の自分や他の開発者が助かります。 |
| 書くべき | 複雑なアルゴリズムや計算式 | 何をしているか一見でわかりにくい処理には、動作の概要を補足します。 |
| 書くべき | エクスポートされた(大文字始まりの)識別子 | Goではエクスポートされた識別子に必ずドキュメントコメントを付けるのが慣習です。go doc が参照します。 |
| 書くべき | パッケージ宣言の直前 | パッケージの目的と使い方を示すパッケージコメントが必要です。go doc の表示の起点になります。 |
| 書かなくてよい | コードを読めば明らかな処理 | 自明な説明はノイズになります。変数名・関数名をわかりやすくすれば不要になります。 |
| 書かなくてよい | 変更履歴・削除したコード | バージョン管理(git)があるため、コメントに古いコードや変更日を残す必要はありません。 |
サンプルコード
comment_basic.go
// comment_basic.go — Go のコメント構文の基本的な使い方です。
package main
import "fmt"
/*
定数として商品の個数を定義します。
ブロックコメントはファイル先頭の説明や大きなコードブロックの
コメントアウトに使うことがあります。
*/
const itemCount = 3
func main() {
// 商品名と価格の配列を定義します
items := [itemCount]string{"widget", "gadget", "device"}
prices := [itemCount]int{1200, 3500, 800} // 税抜価格
total := 0
for i := 0; i < itemCount; i++ {
fmt.Printf("%-10s %5d yen\n", items[i], prices[i])
total += prices[i]
}
fmt.Println("----------")
fmt.Printf("%-10s %5d yen\n", "Total", total)
}
実行結果は次の通りです。
go run comment_basic.go
widget 1200 yen gadget 3500 yen device 800 yen ---------- Total 5500 yen
calculator.go
// Package main はドキュメントコメントの使い方を示すサンプルです。
//
// エクスポートされた関数に // で始まるドキュメントコメントを付けると、
// go doc コマンドで参照できるドキュメントになります。
package main
import (
"errors"
"fmt"
)
// Sum は整数スライスの合計値を計算して返します。
//
// スライスが nil の場合はエラーを返します。
func Sum(values []int) (int, error) {
if values == nil {
// nil スライスはサポート外のためエラーを返します
return 0, errors.New("values must not be nil")
}
total := 0
for _, v := range values {
total += v
}
return total, nil
}
// Average は整数スライスの平均値を計算して返します。
//
// スライスが空の場合は 0.0 とエラーを返します。
func Average(values []int) (float64, error) {
if len(values) == 0 {
/* 空スライスはゼロ除算になるため早期リターンします */
return 0.0, errors.New("values must not be empty")
}
sum, err := Sum(values)
if err != nil {
return 0.0, err
}
// 整数除算を避けるためキャストします
return float64(sum) / float64(len(values)), nil
}
func main() {
scores := []int{85, 92, 78, 95, 60}
sum, _ := Sum(scores)
fmt.Println("Sum: ", sum)
avg, _ := Average(scores)
fmt.Printf("Average: %.1f\n", avg)
// 空スライスのケース
_, err := Average([]int{})
fmt.Println("Empty: ", err)
}
実行結果は次の通りです。
go run calculator.go
Sum: 410 Average: 82.0 Empty: values must not be empty
概要
Goのコメントは『//』と『/* */』の2種類ですが、ドキュメントコメントとしては通常の『//』をそのまま使います。宣言の直前に書いた『//』コメントを『go doc』や『godoc』が解析してドキュメントを生成します。特別なタグは不要です。
慣習として、エクスポートされた識別子(大文字始まり)には必ずドキュメントコメントを付け、「関数名 は…」のように宣言名から始めます。パッケージコメントは『// Package 名前 は…』の形式で package宣言の直前に書きます。最初の文が要約として使われるため、最初の文だけを読んでも意味が通るように書くことが重要です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。