Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 17780] ファイルの概要

コミット

このコミットは、Go言語の公式ドキュメントである doc/effective_go.html における2つの軽微な修正を目的としています。具体的には、godoc ツールによるコード例の展開挙動の変化に対応するための文言修正と、Compare 関数内の switch ステートメントにおけるケースの順序変更です。

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/beca0e124d113fa004b8f559c725c704bab2a89a

元コミット内容

doc/effective_go.html: fix a couple of cosmetic issues
At the moment, godoc expands the example in the link, but in
the past it has not. Add a waffle word to allow either possibility.
Also change the order of cases in the switch in Compare to
be consistent with the other switch in the function.

R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/14439055

変更の背景

このコミットには2つの主要な背景があります。

  1. godoc の挙動変更への対応: godoc はGo言語のソースコードからドキュメントを生成するツールです。過去には、godoc が生成するHTMLドキュメント内でコード例へのリンク(例: strings.Map の例)をクリックしても、その場でコードが展開表示されるわけではありませんでした。しかし、コミット時点(2013年10月)では、godoc の挙動が変更され、リンクをクリックするとコード例が自動的に展開されるようになっていました。この変更により、既存のドキュメントの記述「(click on the word "Example" to open it up)」が常に正確ではなくなったため、「(if necessary, click on the word "Example" to open it up)」というように、「if necessary」(必要であれば)という文言を追加することで、どちらの挙動にも対応できるように修正されました。これは、ユーザー体験の向上とドキュメントの正確性を保つための変更です。

  2. Compare 関数内の switch ステートメントの順序の一貫性: effective_go.html 内に示されている Compare 関数(バイトスライスを比較する例)において、len(a)len(b) の長さを比較する switch ステートメントの case の順序が、他の関連する switch ステートメント(おそらく同じ関数内、またはGo言語の慣習的な比較ロジック)と一貫性がありませんでした。このコミットでは、len(a) < len(b) のケースを len(a) > len(b) のケースの後に移動させることで、コードの可読性と一貫性を向上させています。これは機能的な変更ではなく、コードスタイルと慣習に合わせた整形です。

前提知識の解説

  • effective_go.html: これはGo言語の公式ドキュメントの一部であり、Go言語を効果的に書くためのガイドラインとベストプラクティスを提供しています。Go言語のイディオム、設計原則、一般的な落とし穴などを解説しており、Goプログラマーにとって非常に重要なリソースです。
  • godoc: Go言語のソースコードからドキュメントを生成するためのツールです。Goのパッケージ、関数、型、変数などのドキュメントを自動的に抽出し、HTML形式で表示することができます。godoc は、Goのコードベースを探索し、そのAPIを理解するための主要なツールの一つです。また、godoc はコード例(Example 関数)を認識し、それらをドキュメントに含める機能も持っています。
  • Go言語の switch ステートメント: Go言語の switch ステートメントは、他の言語のそれと似ていますが、いくつかの特徴があります。
    • case には定数だけでなく、任意の式を指定できます。
    • fallthrough キーワードを使用しない限り、マッチした case の実行後、自動的に switch ブロックを抜けます(暗黙的な break)。
    • 式を持たない switch ステートメント(switch {})は、if-else if-else の連鎖として機能し、最初の true となる case が実行されます。このコミットで修正された Compare 関数内の switch はこの形式です。

技術的詳細

godoc の挙動変更

godoc は、Goのソースコード内の Example 関数を特別な方法で扱います。これらの関数は、パッケージのドキュメントに表示され、ユーザーがそのコードがどのように機能するかを理解するのに役立ちます。以前は、godoc が生成するHTMLページでは、これらの例はデフォルトで折りたたまれており、ユーザーが「Example」という単語をクリックして手動で展開する必要がありました。しかし、このコミットの時点では、godoc のフロントエンドまたはバックエンドの変更により、リンクをクリックすると自動的に例が展開されるようになりました。この変更は、ユーザーが例にアクセスする手間を省き、ドキュメントのインタラクティブ性を向上させるためのものです。コミットは、この新しい挙動に対応するために、ドキュメントのテキストを更新しました。

Compare 関数内の switch ステートメントの順序

Compare 関数は、2つのバイトスライス ab を比較し、ab より小さい場合は -1、大きい場合は 1、等しい場合は 0 を返すことを意図しています。この関数内の switch ステートメントは、バイトスライスの長さを比較して、早期に結果を返すロジックを含んでいます。

元のコード:

    switch {
    case len(a) < len(b):
        return -1
    case len(a) > len(b):
        return 1
    }

修正後のコード:

    switch {
    case len(a) > len(b):
        return 1
    case len(a) < len(b):
        return -1
    }

この変更は、機能的には全く同じ結果をもたらします。Goの switch ステートメントは、上から順に case を評価し、最初に true となった case のブロックを実行します。したがって、len(a) < len(b)len(a) > len(b) のどちらが先に評価されても、結果に影響はありません。

この変更の目的は、コミットメッセージにあるように「他の関数内の switch と一貫性を持たせるため」です。これは、Go言語のコーディングスタイルガイドラインや、Rob Pike氏(Go言語の共同開発者の一人)が推奨する特定の慣習に合わせたものと考えられます。一般的に、比較ロジックでは「大きい」条件を先に評価し、「小さい」条件をその後に評価するパターンが好まれることがあります。これにより、コードの読みやすさや、特定のパターンへの一貫性が保たれます。

コアとなるコードの変更箇所

--- a/doc/effective_go.html
+++ b/doc/effective_go.html
@@ -44,8 +44,8 @@ use the language.
 Moreover, many of the packages contain working, self-contained
 executable examples you can run directly from the
 <a href="http://golang.org">golang.org</a> web site, such as
-<a href="http://golang.org/pkg/strings/#example_Map">this one</a> (click
-on the word "Example" to open it up).\n+<a href="http://golang.org/pkg/strings/#example_Map">this one</a> (if
+necessary, click on the word "Example" to open it up).
 If you have a question about how to approach a problem or how something
 might be implemented, the documentation, code and examples in the
 library can provide answers, ideas and
@@ -839,10 +839,10 @@ func Compare(a, b []byte) int {
         }\n     }\n     switch {\n-    case len(a) &lt; len(b):\n-        return -1\n     case len(a) &gt; len(b):\n         return 1\n+    case len(a) &lt; len(b):\n+        return -1\n     }\n     return 0
 }\n

コアとなるコードの解説

1. godoc の挙動変更に対応するテキスト修正

  • 変更前:
    <a href="http://golang.org/pkg/strings/#example_Map">this one</a> (click
    on the word "Example" to open it up).
    
  • 変更後:
    <a href="http://golang.org/pkg/strings/#example_Map">this one</a> (if
    necessary, click on the word "Example" to open it up).
    

この変更は、effective_go.html の冒頭近くにある、strings.Map の例へのリンクに関する説明文を修正しています。godoc の新しい挙動(例が自動的に展開される)に対応するため、「(click on the word "Example" to open it up)」という指示に「if necessary,」(必要であれば、)という条件を追加しました。これにより、例が自動的に展開される場合でも、手動でのクリックが必要な場合でも、ドキュメントの記述が正確に保たれます。

2. Compare 関数内の switch ステートメントのケース順序変更

  • 変更前:
        switch {
        case len(a) < len(b):
            return -1
        case len(a) > len(b):
            return 1
        }
    
  • 変更後:
        switch {
        case len(a) > len(b):
            return 1
        case len(a) < len(b):
            return -1
        }
    

この変更は、effective_go.html 内で例として示されている Compare 関数(バイトスライスの比較)の switch ステートメント内部で行われました。具体的には、len(a) < len(b) のケースと len(a) > len(b) のケースの順序が入れ替えられました。この変更は機能的な影響はなく、コードの実行結果は変わりません。これは、Go言語のコーディングスタイルや、比較ロジックにおける慣習的な順序(例えば、「大きい」条件を先に評価する)に合わせるための、純粋な整形(cosmetic issue)です。これにより、コードの一貫性と可読性が向上します。

関連リンク

参考にした情報源リンク

  • GitHub Goリポジトリ: https://github.com/golang/go
  • Go CL 14439055: https://golang.org/cl/14439055 (このコミットに対応するGoの変更リスト)
  • Go言語の switch ステートメントに関する公式ドキュメントやチュートリアル (一般的なGo言語の知識として参照)
  • godoc の挙動に関する情報 (Goコミュニティの議論やドキュメントから得られる情報)