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

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

このコミットは、Go言語の標準ライブラリの次期バージョン(Go 1.1またはそれ以降)で導入される予定のAPI変更を記録する api/next.txt ファイルを更新するものです。このファイルは、GoのAPI互換性ポリシーに則り、将来のリリースで追加される可能性のあるAPI要素を事前にリストアップし、コミュニティに透明性を提供するために使用されます。

コミット

commit ccef88c56f8b80e2e2c3aea9dd19be6527fb93f8
Author: Russ Cox <rsc@golang.org>
Date:   Wed Nov 7 15:26:41 2012 -0500

    api: refresh next.txt

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

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

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

元コミット内容

api: refresh next.txt

変更の背景

Go言語は、後方互換性を非常に重視しており、特に標準ライブラリのAPI変更には厳格なポリシーを設けています。api/next.txt ファイルは、このポリシーの一環として機能します。Goの新しいリリースサイクルにおいて、開発中に導入される可能性のある新しいAPI要素(関数、メソッド、型、定数など)は、まずこのファイルにリストアップされます。これにより、Goの開発チームは、APIの追加や変更を計画的に行い、将来のリリースで実際に導入される前に、コミュニティからのフィードバックを受けたり、潜在的な影響を評価したりする機会を得ます。

このコミットは、Go 1.1のリリースに向けて、開発中に蓄積された新しいAPIの追加を api/next.txt に反映させるための定期的な更新です。これにより、GoのAPIがどのように進化しているかを明確にし、Goユーザーが将来の変更に備えることができるようになります。

前提知識の解説

  • Go言語のAPI互換性ポリシー: Go言語は、バージョン1以降、後方互換性を維持することを強く約束しています。これは、既存のGoプログラムが新しいバージョンのGoコンパイラでコンパイルでき、期待通りに動作することを意味します。APIの追加は許可されますが、既存のAPIの変更や削除は厳しく制限されます。api/next.txt は、このポリシーを遵守しつつ、新しい機能や改善を導入するためのメカニズムの一部です。
  • api/next.txt: Goプロジェクト内で使用される特殊なファイルで、次期リリースで追加される予定の標準ライブラリのAPI要素が記述されています。このファイルは、Goのビルドプロセスの一部としてチェックされ、ここに記載されていないAPIが追加された場合、ビルドエラーとなることがあります。これにより、APIの追加が意図的かつ計画的に行われることが保証されます。
  • Goのリリースサイクル: Goは通常、年に2回のメジャーリリース(例: Go 1.x)を行います。各リリースでは、言語の改善、標準ライブラリの拡張、パフォーマンスの最適化などが行われます。

技術的詳細

このコミットの技術的詳細は、api/next.txt ファイルに追加された具体的なAPI要素に集約されます。以下に、主要な変更点をパッケージごとに分類して解説します。

  • archive/zip:
    • FileHeader 構造体に CompressedSize64UncompressedSize64 フィールドが追加されました。これは、ZIPアーカイブ内の非常に大きなファイル(4GB以上)を扱うための64ビットサイズ対応を導入するものです。従来のZIPフォーマットでは32ビットのサイズ制限がありましたが、これにより現代の大容量データに対応できるようになります。
  • bufio:
    • Reader および Writer 型に WriteTo および ReadFrom メソッドが追加されました。これらは io.WriterTo および io.ReaderFrom インターフェースの実装であり、バッファリングされたI/Oにおいて、直接データ転送を行うことで効率を向上させます。例えば、io.Copy のような操作で中間バッファを介さずにデータをコピーできるようになります。
  • bytes:
    • Buffer 型に Grow メソッドが追加されました。これは、bytes.Buffer の内部バッファを事前に拡張するためのもので、連続した書き込み操作において再割り当ての回数を減らし、パフォーマンスを向上させることができます。
    • Reader 型に WriteTo メソッドが追加されました。これも io.WriterTo インターフェースの実装で、bytes.Reader の内容を効率的に別の io.Writer に書き出すことを可能にします。
  • crypto/hmac:
    • Equal 関数が追加されました。これは、HMAC(Keyed-Hash Message Authentication Code)の比較をサイドチャネル攻撃に対して安全に行うためのものです。通常のバイト列比較では、比較にかかる時間から秘密鍵に関する情報が漏洩する可能性がありますが、この関数は一定時間で比較を行うことでそのリスクを軽減します。
  • crypto/tls:
    • Config 構造体に SessionTicketKeySessionTicketsDisabled フィールドが追加されました。これらはTLSセッションチケットのサポートを強化するためのものです。セッションチケットを使用すると、TLSハンドシェイクのオーバーヘッドを削減し、再接続時のパフォーマンスを向上させることができます。
    • ConnectionState 構造体に DidResume フィールドが追加されました。これは、現在のTLS接続がセッション再開によって確立されたかどうかを示すものです。
  • crypto/x509:
    • DecryptPEMBlock 関数と IsEncryptedPEMBlock 関数が追加されました。これらは、PEMエンコードされた秘密鍵などのブロックが暗号化されているかどうかを判断し、復号化するための機能を提供します。これにより、暗号化されたPEMブロックの取り扱いが容易になります。
    • IncorrectPasswordError 変数が追加されました。これは、PEMブロックの復号化に失敗した場合に返されるエラーです。
  • debug/pe:
    • WindowsのPE(Portable Executable)ファイル形式のデバッグ情報に関する多くの型とフィールドが追加されました。これには COFFSymbol 構造体とそのフィールド、File 構造体の Symbols フィールド、および Symbol 構造体が含まれます。これにより、GoのツールがPEファイル内のシンボル情報をより詳細に解析できるようになります。
  • go/ast:
    • CommentMapUpdate メソッドのシグネチャが変更され、Node 型の引数が2つになりました。これは、AST(Abstract Syntax Tree)のノードが更新された際に、コメントマップも適切に更新できるようにするための変更です。
    • ChanType 構造体に Arrow フィールドが追加されました。これは、チャネル型の構文(<-chan Tchan<- T)における矢印の位置を保持するためのものです。
    • ChainNodeDotNodeFieldNodeIdentifierNodeNilNode など、ASTの様々なノード型に Position() メソッドが追加されました。これにより、ASTノードがソースコード内のどの位置に対応するかを正確に取得できるようになり、ツール開発やエラー報告の精度が向上します。
  • go/build:
    • Context 構造体に InstallTag フィールドが追加されました。これは、Goのビルドプロセスにおいて、特定のビルドタグに基づいてパッケージのインストールを制御するためのものです。
  • go/doc:
    • Example 構造体に Play フィールドが追加されました。これは、Goのドキュメント生成ツールが、実行可能なコード例(Go Playgroundで実行できる形式)をより適切に扱うためのものです。
  • io:
    • ByteWriter インターフェースが追加されました。これは、バイト単位で書き込みを行うためのシンプルなインターフェースです。
  • net:
    • LookupNS 関数と NS 型が追加されました。これらは、DNSのネームサーバ(NS)レコードをルックアップするための機能を提供します。
    • IPConn および UDPConn 型に ReadMsgIP および WriteMsgIP メソッドが追加されました。これらは、IPレベルのメッセージ(IPヘッダや補助データを含む)を送受信するためのもので、より低レベルなネットワークプログラミングを可能にします。
  • net/http:
    • ParseTime 関数が追加されました。これは、HTTPヘッダで使用される日付/時刻文字列を解析するためのものです。
    • ServeMuxHandler メソッドが追加されました。これは、特定のリクエストに対するハンドラとパスを返すものです。
  • net/mail:
    • ParseAddress 関数と ParseAddressList 関数が追加されました。これらは、RFC 5322に準拠したメールアドレス文字列を解析するためのものです。
  • reflect:
    • Select 関数、SelectCase 型、SelectDir 型、および関連する定数が追加されました。これらは、Goの select ステートメントの機能をリフレクションAPIを通じて利用するためのものです。これにより、実行時に動的にチャネル操作を選択できるようになり、より柔軟な並行処理の構築が可能になります。
    • MakeFunc 関数が追加されました。これは、リフレクションを使って新しい関数を作成するためのものです。
    • Value 型に Convert メソッドが追加されました。これは、リフレクションを使って値を別の型に変換するためのものです。
    • Type インターフェースに ConvertibleTo メソッドが追加されました。これは、ある型が別の型に変換可能かどうかをチェックするためのものです。
  • runtime:
    • BlockProfile 関数、SetBlockProfileRate 関数、BlockProfileRecord 型、および関連するフィールドが追加されました。これらは、Goプログラムのブロッキングプロファイル(goroutineがブロッキング操作で費やした時間)を収集するための機能を提供します。これにより、並行処理におけるパフォーマンスボトルネックの特定が容易になります。
  • syscall:
    • Darwin (macOS)、Linux、Windowsなど、様々なOSおよびアーキテクチャ向けの syscall パッケージに多数の変更が加えられています。これには、特定のシステムコール(例: GetsockoptUcred, Getxattr, Setxattr, Removexattr, PtraceSyscall)、構造体(例: Inet4Pktinfo, Ucred, AddrinfoW, RawSockaddrInet6)、および定数(例: AI_CANONNAME, ERROR_NOT_FOUND)の追加が含まれます。これらの変更は、Goがより多くのOS固有の機能や低レベルなシステム操作をサポートするためのものです。
  • testing:
    • BenchmarkResult 型に AllocedBytesPerOpAllocsPerOpMemString メソッド、および MemAllocsMemBytes フィールドが追加されました。これらは、Goのベンチマークテストにおいて、メモリ割り当てに関する詳細な統計情報を取得するためのものです。これにより、メモリ使用量の最適化がより容易になります。
  • text/template/parse:
    • テンプレートのパースツリーにおけるノードの位置情報(Pos)を扱うための多くの変更が加えられました。様々なノード型に Position() メソッドが追加され、Tree 構造体に ErrorContext メソッドが追加されました。これにより、テンプレートの構文エラーが発生した際に、より正確なエラーメッセージと位置情報を提供できるようになります。
  • unicode:
    • 新しいUnicodeスクリプト(例: Chakma, Meroitic_Cursive, Miao, Sharada, Sora_Sompeng, Takri)の RangeTable が追加されました。これにより、GoのUnicodeサポートが拡張され、より多くの言語や文字体系を正確に処理できるようになります。

これらの変更は、Go言語が進化し、より多くのユースケースに対応し、パフォーマンスと機能性を向上させるための継続的な取り組みの一部です。

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

このコミットのコアとなる変更は、api/next.txt ファイルの内容そのものです。このファイルは、Goの標準ライブラリのAPI定義をテキスト形式で記述したものであり、このコミットでは、前述の技術的詳細で述べた多数の新しい関数、メソッド、型、定数が追加されています。

具体的には、diff --git a/api/next.txt b/api/next.txt のセクションに示されているように、既存の行の削除(3行)と新しい行の追加(236行)が行われています。これらの追加行が、Go 1.1以降で導入される予定の新しいAPI要素を定義しています。

例:

--- a/api/next.txt
+++ b/api/next.txt
@@ -1,7 +1,18 @@
 pkg archive/tar, func FileInfoHeader(os.FileInfo, string) (*Header, error)
+pkg archive/zip, type FileHeader struct, CompressedSize64 uint64
+pkg archive/zip, type FileHeader struct, UncompressedSize64 uint64
+pkg bufio, method (*Reader) WriteTo(io.Writer) (int64, error)
+pkg bufio, method (*Writer) ReadFrom(io.Reader) (int64, error)
+pkg bufio, method (ReadWriter) ReadFrom(io.Reader) (int64, error)
+pkg bufio, method (ReadWriter) WriteTo(io.Writer) (int64, error)
 pkg bytes, method (*Buffer) Grow(int)
+pkg bytes, method (*Reader) WriteTo(io.Writer) (int64, error)
+pkg crypto/hmac, func Equal([]byte, []byte) bool
 pkg crypto/tls, const TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA uint16
 pkg crypto/tls, const TLS_RSA_WITH_AES_256_CBC_SHA uint16
+pkg crypto/tls, type Config struct, SessionTicketKey [32]byte
+pkg crypto/tls, type Config struct, SessionTicketsDisabled bool
+pkg crypto/tls, type ConnectionState struct, DidResume bool

この差分は、archive/zip パッケージの FileHeader 構造体に CompressedSize64UncompressedSize64 が追加されたこと、bufio パッケージに WriteToReadFrom メソッドが追加されたこと、bytes パッケージに Grow メソッドと WriteTo メソッドが追加されたこと、crypto/hmacEqual 関数が追加されたこと、crypto/tls にセッションチケット関連のフィールドが追加されたことなどを示しています。

コアとなるコードの解説

api/next.txt は、Goのビルドシステムによって解析される特別なファイルです。Goのコンパイラやツールチェーンは、このファイルに記載されているAPIのみが標準ライブラリに追加されることを期待します。もし、このファイルに記載されていないAPIがコードベースに追加された場合、ビルド時にエラーが発生し、開発者はそのAPIを api/next.txt に追加するか、そのAPIの追加を取り消す必要があります。

このメカニズムは、GoのAPI互換性ポリシーを強制し、意図しないAPIの変更や追加を防ぐ上で非常に重要です。api/next.txt を定期的に「リフレッシュ」する(つまり、開発中に導入された新しいAPIを反映させる)ことで、Goの開発プロセスは透明性を保ち、将来のリリースで何が期待できるかをコミュニティに明確に伝えます。

このコミット自体は、Goのソースコードの機能的な変更(例えば、新しい関数の実装)を行うものではなく、あくまでAPIの「宣言」を更新するものです。実際の機能実装は、このコミットとは別のコミットで既に行われているか、今後行われることになります。

関連リンク

  • Go言語の互換性保証: https://go.dev/doc/go1compat
  • GoのAPIレビュープロセスに関する議論(一般的な情報源として): Goのメーリングリストやデザインドキュメントで「Go API review process」などで検索すると、より詳細な情報が見つかる可能性があります。

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のソースコードリポジトリ(特に api/next.txt ファイルの履歴)
  • Goのメーリングリストアーカイブ (golang-dev)
  • GoのChange List (CL) 6811092: https://golang.org/cl/6811092 (これはコミットメッセージに記載されているリンクであり、このコミットの直接の変更元です。)
  • Goのリリースノート(Go 1.1のリリースノートなど、このコミットが関連するリリースについて言及されている可能性のあるもの)

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

このコミットは、Go言語の標準ライブラリの次期バージョン(Go 1.1またはそれ以降)で導入される予定のAPI変更を記録する api/next.txt ファイルを更新するものです。このファイルは、GoのAPI互換性ポリシーに則り、将来のリリースで追加される可能性のあるAPI要素を事前にリストアップし、コミュニティに透明性を提供するために使用されます。

コミット

commit ccef88c56f8b80e2e2c3aea9dd19be6527fb93f8
Author: Russ Cox <rsc@golang.org>
Date:   Wed Nov 7 15:26:41 2012 -0500

    api: refresh next.txt

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

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

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

元コミット内容

api: refresh next.txt

変更の背景

Go言語は、後方互換性を非常に重視しており、特に標準ライブラリのAPI変更には厳格なポリシーを設けています。api/next.txt ファイルは、このポリシーの一環として機能します。Goの新しいリリースサイクルにおいて、開発中に導入される可能性のある新しいAPI要素(関数、メソッド、型、定数など)は、まずこのファイルにリストアップされます。これにより、Goの開発チームは、APIの追加や変更を計画的に行い、将来のリリースで実際に導入される前に、コミュニティからのフィードバックを受けたり、潜在的な影響を評価したりする機会を得ます。

このコミットは、Go 1.1のリリースに向けて、開発中に蓄積された新しいAPIの追加を api/next.txt に反映させるための定期的な更新です。これにより、GoのAPIがどのように進化しているかを明確にし、Goユーザーが将来の変更に備えることができるようになります。

前提知識の解説

  • Go言語のAPI互換性ポリシー: Go言語は、バージョン1以降、後方互換性を強く約束しています。これは、既存のGoプログラムが新しいバージョンのGoコンパイラでコンパイルでき、期待通りに動作することを意味します。APIの追加は許可されますが、既存のAPIの変更や削除は厳しく制限されます。api/next.txt は、このポリシーを遵守しつつ、新しい機能や改善を導入するためのメカニズムの一部です。
  • api/next.txt: Goプロジェクト内で使用される特殊なファイルで、次期リリースで追加される予定の標準ライブラリのAPI要素が記述されています。このファイルは、Goのビルドプロセスの一部としてチェックされ、ここに記載されていないAPIが追加された場合、ビルドエラーとなることがあります。これにより、APIの追加が意図的かつ計画的に行われることが保証されます。
  • Goのリリースサイクル: Goは通常、年に2回のメジャーリリース(例: Go 1.x)を行います。各リリースでは、言語の改善、標準ライブラリの拡張、パフォーマンスの最適化などが行われます。

技術的詳細

このコミットの技術的詳細は、api/next.txt ファイルに追加された具体的なAPI要素に集約されます。以下に、主要な変更点をパッケージごとに分類して解説します。

  • archive/zip:
    • FileHeader 構造体に CompressedSize64UncompressedSize64 フィールドが追加されました。これは、ZIPアーカイブ内の非常に大きなファイル(4GB以上)を扱うための64ビットサイズ対応を導入するものです。従来のZIPフォーマットでは32ビットのサイズ制限がありましたが、これにより現代の大容量データに対応できるようになります。
  • bufio:
    • Reader および Writer 型に WriteTo および ReadFrom メソッドが追加されました。これらは io.WriterTo および io.ReaderFrom インターフェースの実装であり、バッファリングされたI/Oにおいて、直接データ転送を行うことで効率を向上させます。例えば、io.Copy のような操作で中間バッファを介さずにデータをコピーできるようになります。
  • bytes:
    • Buffer 型に Grow メソッドが追加されました。これは、bytes.Buffer の内部バッファを事前に拡張するためのもので、連続した書き込み操作において再割り当ての回数を減らし、パフォーマンスを向上させることができます。
    • Reader 型に WriteTo メソッドが追加されました。これも io.WriterTo インターフェースの実装で、bytes.Reader の内容を効率的に別の io.Writer に書き出すことを可能にします。
  • crypto/hmac:
    • Equal 関数が追加されました。これは、HMAC(Keyed-Hash Message Authentication Code)の比較をサイドチャネル攻撃に対して安全に行うためのものです。通常のバイト列比較では、比較にかかる時間から秘密鍵に関する情報が漏洩する可能性がありますが、この関数は一定時間で比較を行うことでそのリスクを軽減します。
  • crypto/tls:
    • Config 構造体に SessionTicketKeySessionTicketsDisabled フィールドが追加されました。これらはTLSセッションチケットのサポートを強化するためのものです。セッションチケットを使用すると、TLSハンドシェイクのオーバーヘッドを削減し、再接続時のパフォーマンスを向上させることができます。
    • ConnectionState 構造体に DidResume フィールドが追加されました。これは、現在のTLS接続がセッション再開によって確立されたかどうかを示すものです。
  • crypto/x509:
    • DecryptPEMBlock 関数と IsEncryptedPEMBlock 関数が追加されました。これらは、PEMエンコードされた秘密鍵などのブロックが暗号化されているかどうかを判断し、復号化するための機能を提供します。これにより、暗号化されたPEMブロックの取り扱いが容易になります。
    • IncorrectPasswordError 変数が追加されました。これは、PEMブロックの復号化に失敗した場合に返されるエラーです。
  • debug/pe:
    • WindowsのPE(Portable Executable)ファイル形式のデバッグ情報に関する多くの型とフィールドが追加されました。これには COFFSymbol 構造体とそのフィールド、File 構造体の Symbols フィールド、および Symbol 構造体が含まれます。これにより、GoのツールがPEファイル内のシンボル情報をより詳細に解析できるようになります。
  • go/ast:
    • CommentMapUpdate メソッドのシグネチャが変更され、Node 型の引数が2つになりました。これは、AST(Abstract Syntax Tree)のノードが更新された際に、コメントマップも適切に更新できるようにするための変更です。
    • ChanType 構造体に Arrow フィールドが追加されました。これは、チャネル型の構文(<-chan Tchan<- T)における矢印の位置を保持するためのものです。
    • ChainNodeDotNodeFieldNodeIdentifierNodeNilNode など、ASTの様々なノード型に Position() メソッドが追加されました。これにより、ASTノードがソースコード内のどの位置に対応するかを正確に取得できるようになり、ツール開発やエラー報告の精度が向上します。
  • go/build:
    • Context 構造体に InstallTag フィールドが追加されました。これは、Goのビルドプロセスにおいて、特定のビルドタグに基づいてパッケージのインストールを制御するためのものです。
  • go/doc:
    • Example 構造体に Play フィールドが追加されました。これは、Goのドキュメント生成ツールが、実行可能なコード例(Go Playgroundで実行できる形式)をより適切に扱うためのものです。
  • io:
    • ByteWriter インターフェースが追加されました。これは、バイト単位で書き込みを行うためのシンプルなインターフェースです。
  • net:
    • LookupNS 関数と NS 型が追加されました。これらは、DNSのネームサーバ(NS)レコードをルックアップするための機能を提供します。
    • IPConn および UDPConn 型に ReadMsgIP および WriteMsgIP メソッドが追加されました。これらは、IPレベルのメッセージ(IPヘッダや補助データを含む)を送受信するためのもので、より低レベルなネットワークプログラミングを可能にします。
  • net/http:
    • ParseTime 関数が追加されました。これは、HTTPヘッダで使用される日付/時刻文字列を解析するためのものです。
    • ServeMuxHandler メソッドが追加されました。これは、特定のリクエストに対するハンドラとパスを返すものです。
  • net/mail:
    • ParseAddress 関数と ParseAddressList 関数が追加されました。これらは、RFC 5322に準拠したメールアドレス文字列を解析するためのものです。
  • reflect:
    • Select 関数、SelectCase 型、SelectDir 型、および関連する定数が追加されました。これらは、Goの select ステートメントの機能をリフレクションAPIを通じて利用するためのものです。これにより、実行時に動的にチャネル操作を選択できるようになり、より柔軟な並行処理の構築が可能になります。
    • MakeFunc 関数が追加されました。これは、リフレクションを使って新しい関数を作成するためのものです。
    • Value 型に Convert メソッドが追加されました。これは、リフレクションを使って値を別の型に変換するためのものです。
    • Type インターフェースに ConvertibleTo メソッドが追加されました。これは、ある型が別の型に変換可能かどうかをチェックするためのものです。
  • runtime:
    • BlockProfile 関数、SetBlockProfileRate 関数、BlockProfileRecord 型、および関連するフィールドが追加されました。これらは、Goプログラムのブロッキングプロファイル(goroutineがブロッキング操作で費やした時間)を収集するための機能を提供します。これにより、並行処理におけるパフォーマンスボトルネックの特定が容易になります。
  • syscall:
    • Darwin (macOS)、Linux、Windowsなど、様々なOSおよびアーキテクチャ向けの syscall パッケージに多数の変更が加えられています。これには、特定のシステムコール(例: GetsockoptUcred, Getxattr, Setxattr, Removexattr, PtraceSyscall)、構造体(例: Inet4Pktinfo, Ucred, AddrinfoW, RawSockaddrInet6)、および定数(例: AI_CANONNAME, ERROR_NOT_FOUND)の追加が含まれます。これらの変更は、Goがより多くのOS固有の機能や低レベルなシステム操作をサポートするためのものです。
  • testing:
    • BenchmarkResult 型に AllocedBytesPerOpAllocsPerOpMemString メソッド、および MemAllocsMemBytes フィールドが追加されました。これらは、Goのベンチマークテストにおいて、メモリ割り当てに関する詳細な統計情報を取得するためのものです。これにより、メモリ使用量の最適化がより容易になります。
  • text/template/parse:
    • テンプレートのパースツリーにおけるノードの位置情報(Pos)を扱うための多くの変更が加えられました。様々なノード型に Position() メソッドが追加され、Tree 構造体に ErrorContext メソッドが追加されました。これにより、テンプレートの構文エラーが発生した際に、より正確なエラーメッセージと位置情報を提供できるようになります。
  • unicode:
    • 新しいUnicodeスクリプト(例: Chakma, Meroitic_Cursive, Miao, Sharada, Sora_Sompeng, Takri)の RangeTable が追加されました。これにより、GoのUnicodeサポートが拡張され、より多くの言語や文字体系を正確に処理できるようになります。

これらの変更は、Go言語が進化し、より多くのユースケースに対応し、パフォーマンスと機能性を向上させるための継続的な取り組みの一部です。

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

このコミットのコアとなる変更は、api/next.txt ファイルの内容そのものです。このファイルは、Goの標準ライブラリのAPI定義をテキスト形式で記述したものであり、このコミットでは、前述の技術的詳細で述べた多数の新しい関数、メソッド、型、定数が追加されています。

具体的には、diff --git a/api/next.txt b/api/next.txt のセクションに示されているように、既存の行の削除(3行)と新しい行の追加(236行)が行われています。これらの追加行が、Go 1.1以降で導入される予定の新しいAPI要素を定義しています。

例:

--- a/api/next.txt
+++ b/api/next.txt
@@ -1,7 +1,18 @@
 pkg archive/tar, func FileInfoHeader(os.FileInfo, string) (*Header, error)
+pkg archive/zip, type FileHeader struct, CompressedSize64 uint64
+pkg archive/zip, type FileHeader struct, UncompressedSize64 uint64
+pkg bufio, method (*Reader) WriteTo(io.Writer) (int64, error)
+pkg bufio, method (*Writer) ReadFrom(io.Reader) (int64, error)
+pkg bufio, method (ReadWriter) ReadFrom(io.Reader) (int64, error)
+pkg bufio, method (ReadWriter) WriteTo(io.Writer) (int64, error)
 pkg bytes, method (*Buffer) Grow(int)
+pkg bytes, method (*Reader) WriteTo(io.Writer) (int64, error)
+pkg crypto/hmac, func Equal([]byte, []byte) bool
 pkg crypto/tls, const TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA uint16
 pkg crypto/tls, const TLS_RSA_WITH_AES_256_CBC_SHA uint16
+pkg crypto/tls, type Config struct, SessionTicketKey [32]byte
+pkg crypto/tls, type Config struct, SessionTicketsDisabled bool
+pkg crypto/tls, type ConnectionState struct, DidResume bool

この差分は、archive/zip パッケージの FileHeader 構造体に CompressedSize64UncompressedSize64 が追加されたこと、bufio パッケージに WriteToReadFrom メソッドが追加されたこと、bytes パッケージに Grow メソッドと WriteTo メソッドが追加されたこと、crypto/hmacEqual 関数が追加されたこと、crypto/tls にセッションチケット関連のフィールドが追加されたことなどを示しています。

コアとなるコードの解説

api/next.txt は、Goのビルドシステムによって解析される特別なファイルです。Goのコンパイラやツールチェーンは、このファイルに記載されているAPIのみが標準ライブラリに追加されることを期待します。もし、このファイルに記載されていないAPIがコードベースに追加された場合、ビルド時にエラーが発生し、開発者はそのAPIを api/next.txt に追加するか、そのAPIの追加を取り消す必要があります。

このメカニズムは、GoのAPI互換性ポリシーを強制し、意図しないAPIの変更や追加を防ぐ上で非常に重要です。api/next.txt を定期的に「リフレッシュ」する(つまり、開発中に導入された新しいAPIを反映させる)ことで、Goの開発プロセスは透明性を保ち、将来のリリースで何が期待できるかをコミュニティに明確に伝えます。

このコミット自体は、Goのソースコードの機能的な変更(例えば、新しい関数の実装)を行うものではなく、あくまでAPIの「宣言」を更新するものです。実際の機能実装は、このコミットとは別のコミットで既に行われているか、今後行われることになります。

関連リンク

  • Go言語の互換性保証: https://go.dev/doc/go1compat
  • GoのAPIレビュープロセスに関する議論(一般的な情報源として): Goのメーリングリストやデザインドキュメントで「Go API review process」などで検索すると、より詳細な情報が見つかる可能性があります。

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のソースコードリポジトリ(特に api/next.txt ファイルの履歴)
  • Goのメーリングリストアーカイブ (golang-dev)
  • GoのChange List (CL) 6811092: https://golang.org/cl/6811092 (これはコミットメッセージに記載されているリンクであり、このコミットの直接の変更元です。)
  • Goのリリースノート(Go 1.1のリリースノートなど、このコミットが関連するリリースについて言及されている可能性のあるもの)