言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. Go辞典
  3. コメント(// と /* */)

コメント(// と /* */)

『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宣言の直前に書きます。最初の文が要約として使われるため、最初の文だけを読んでも意味が通るように書くことが重要です。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。