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

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

このコミットは、Go言語の標準ライブラリunicodeパッケージに新しく追加されたunicode.In関数のドキュメントを、Go 1.2のリリースノートファイルdoc/go1.2.txtに追記するものです。unicode.Inは、既存のunicode.IsOneOf関数と同等の機能を提供しますが、より使いやすいシグネチャを持つことが特徴です。

コミット

  • コミットハッシュ: ac94c06d1e57fb4e41b547ce7652a6d698cfcf17
  • 作者: Rob Pike r@golang.org
  • コミット日時: 2013年7月24日(水) 10:54:33 +1000
  • コミットメッセージ:
    doc/go1.2.txt: document new function unicode.In
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/11745044
    

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

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

元コミット内容

commit ac94c06d1e57fb4e41b547ce7652a6d698cfcf17
Author: Rob Pike <r@golang.org>
Date:   Wed Jul 24 10:54:33 2013 +1000

    doc/go1.2.txt: document new function unicode.In
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/11745044
---
 doc/go1.2.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/doc/go1.2.txt b/doc/go1.2.txt
index 079b4f762b..a47a24145d 100644
--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -26,3 +26,4 @@ net: new build tag netgo for building a pure Go net package (CL 7100050).
 sort: new Stable function provides stable sort (CL 9612044).
 syscall: implemented Sendfile for Darwin, added Syscall9 for Darwin/amd64 (CL 10980043).
 testing: AllocsPerRun is now quantized to an integer (the type is still float64) (CL 9837049).
+unicode: add In, a nicer-to-use but equivalent version of IsOneOf (CL 11672044).

変更の背景

このコミットの背景には、Go言語のunicodeパッケージにおける文字集合の判定関数の使いやすさの改善があります。既存のunicode.IsOneOf関数は、複数のRangeTable(文字の範囲を定義する構造体)に対してルーン(Unicodeコードポイント)が属するかどうかを判定するために使用されていました。しかし、この関数はRangeTableのスライスを引数として取るため、複数の文字集合をチェックする際に、事前にスライスを作成する必要がありました。

unicode.In関数は、このIsOneOf関数と全く同じ機能を提供しますが、可変長引数(variadic arguments)としてRangeTableを直接受け取ることができます。これにより、開発者はより簡潔なコードで同じ処理を記述できるようになり、APIの使い勝手が向上しました。この変更は、Go言語の設計哲学である「シンプルさと実用性」に沿った改善と言えます。

前提知識の解説

このコミットを理解するためには、以下のGo言語およびUnicodeに関する基本的な知識が必要です。

  • Go言語のunicodeパッケージ: Go言語の標準ライブラリであるunicodeパッケージは、Unicode文字のプロパティ(カテゴリ、スクリプト、範囲など)を扱うための機能を提供します。これにより、多言語対応のアプリケーション開発が容易になります。

  • rune: Go言語では、Unicodeコードポイントを表現するためにrune型が使用されます。runeint32のエイリアスであり、UTF-8でエンコードされた文字列から個々のUnicode文字を安全に扱うことができます。

  • unicode.RangeTable: unicodeパッケージにおいて、RangeTableはUnicodeコードポイントの集合、つまり特定の文字の範囲を定義するために使用される構造体です。例えば、unicode.Latinはラテン文字の範囲を、unicode.Cyrillicはキリル文字の範囲を定義するRangeTableです。これらのRangeTableは、Unicodeの文字プロパティデータベースに基づいて定義されています。

  • unicode.IsOneOf関数: func IsOneOf(ranges []*RangeTable, r rune) bool この関数は、与えられたルーンrが、rangesスライスで指定されたいずれかのRangeTableに含まれるかどうかを判定します。例えば、ある文字がラテン文字またはギリシャ文字のいずれかであるかをチェックする際に使用されます。

    import "unicode"
    
    r := 'é'
    // 'é' が Latin または Greek のいずれかに含まれるかチェック
    isOneOf := unicode.IsOneOf([]*unicode.RangeTable{unicode.Latin, unicode.Greek}, r)
    fmt.Printf("Is '%c' one of Latin or Greek? %t\n", r, isOneOf) // Output: Is 'é' one of Latin or Greek? true
    

技術的詳細

このコミットでドキュメントが追加されたunicode.In関数は、unicode.IsOneOf関数と機能的には同等ですが、そのシグネチャ(関数の定義)が異なります。

  • unicode.IsOneOfのシグネチャ: func IsOneOf(ranges []*RangeTable, r rune) bool この関数は、第一引数として*unicode.RangeTable型のスライスを受け取ります。これは、チェックしたい文字集合が複数ある場合に、それらを事前にスライスにまとめて渡す必要があることを意味します。

  • unicode.Inのシグネチャ: func In(r rune, ranges ...*RangeTable) bool この関数は、第一引数にチェック対象のルーンrを取り、第二引数以降に可変長引数として*unicode.RangeTableを受け取ります。可変長引数を使用することで、呼び出し側はRangeTableのスライスを明示的に作成することなく、複数のRangeTableを直接引数として渡すことができます。

    import "unicode"
    
    r := 'é'
    // 'é' が Latin または Greek のいずれかに含まれるかチェック (In関数を使用)
    isIn := unicode.In(r, unicode.Latin, unicode.Greek)
    fmt.Printf("Is '%c' in Latin or Greek? %t\n", r, isIn) // Output: Is 'é' in Latin or Greek? true
    

この違いは、特に複数のRangeTableに対してチェックを行う場合に顕著です。IsOneOfでは[]*unicode.RangeTable{unicode.Latin, unicode.Greek}のようにスライスリテラルを記述する必要がありましたが、Inではunicode.Latin, unicode.Greekのように直接列挙できるため、コードがより簡潔になります。Go言語のドキュメントでも、unicode.Inが「より良いシグネチャを提供し、IsOneOfよりも優先して使用されるべき」と明記されています。

この変更は、Go 1.2のリリースの一部として導入されました。Go 1.2のリリースノート自体は、スケジューラの改善やgoroutineの最小スタックサイズの増加など、より広範なパフォーマンスとランタイムの改善に焦点を当てていましたが、このようなAPIの使いやすさの改善も含まれていました。

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

このコミットによるコードの変更は、doc/go1.2.txtファイルへの1行の追加のみです。

--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -26,3 +26,4 @@ net: new build tag netgo for building a pure Go net package (CL 7100050).
 sort: new Stable function provides stable sort (CL 9612044).
 syscall: implemented Sendfile for Darwin, added Syscall9 for Darwin/amd64 (CL 10980043).
 testing: AllocsPerRun is now quantized to an integer (the type is still float64) (CL 9837049).
+unicode: add In, a nicer-to-use but equivalent version of IsOneOf (CL 11672044).

具体的には、以下の行が追加されました。

+unicode: add In, a nicer-to-use but equivalent version of IsOneOf (CL 11672044).

コアとなるコードの解説

追加された1行は、Go 1.2のリリースノートの一部として、unicodeパッケージに新しい関数Inが追加されたことを簡潔に説明しています。

  • unicode: add In: unicodeパッケージにIn関数が追加されたことを示します。
  • a nicer-to-use but equivalent version of IsOneOf: In関数が、既存のIsOneOf関数と同等の機能を持つが、より使いやすいバージョンであることを説明しています。これは、前述の可変長引数によるAPIの改善を指しています。
  • (CL 11672044): この変更が、Gerritの変更リスト(Change-ID)11672044によって導入されたことを示しています。このCL(Change List)は、実際にunicode.In関数が追加されたコミットを指します。このコミット自体は、その変更をリリースノートに反映させるためのドキュメントコミットです。

この行は、Go 1.2のユーザーが新しいunicode.In関数の存在とその利便性を認識できるようにするための重要な情報です。

関連リンク

参考にした情報源リンク