[インデックス 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構造体にCompressedSize64とUncompressedSize64フィールドが追加されました。これは、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構造体にSessionTicketKeyとSessionTicketsDisabledフィールドが追加されました。これらは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ファイル内のシンボル情報をより詳細に解析できるようになります。
- WindowsのPE(Portable Executable)ファイル形式のデバッグ情報に関する多くの型とフィールドが追加されました。これには
go/ast:CommentMapのUpdateメソッドのシグネチャが変更され、Node型の引数が2つになりました。これは、AST(Abstract Syntax Tree)のノードが更新された際に、コメントマップも適切に更新できるようにするための変更です。ChanType構造体にArrowフィールドが追加されました。これは、チャネル型の構文(<-chan Tやchan<- T)における矢印の位置を保持するためのものです。ChainNode、DotNode、FieldNode、IdentifierNode、NilNodeなど、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ヘッダで使用される日付/時刻文字列を解析するためのものです。ServeMuxにHandlerメソッドが追加されました。これは、特定のリクエストに対するハンドラとパスを返すものです。
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固有の機能や低レベルなシステム操作をサポートするためのものです。
- Darwin (macOS)、Linux、Windowsなど、様々なOSおよびアーキテクチャ向けの
testing:BenchmarkResult型にAllocedBytesPerOp、AllocsPerOp、MemStringメソッド、およびMemAllocs、MemBytesフィールドが追加されました。これらは、Goのベンチマークテストにおいて、メモリ割り当てに関する詳細な統計情報を取得するためのものです。これにより、メモリ使用量の最適化がより容易になります。
text/template/parse:- テンプレートのパースツリーにおけるノードの位置情報(
Pos)を扱うための多くの変更が加えられました。様々なノード型にPosition()メソッドが追加され、Tree構造体にErrorContextメソッドが追加されました。これにより、テンプレートの構文エラーが発生した際に、より正確なエラーメッセージと位置情報を提供できるようになります。
- テンプレートのパースツリーにおけるノードの位置情報(
unicode:- 新しいUnicodeスクリプト(例:
Chakma,Meroitic_Cursive,Miao,Sharada,Sora_Sompeng,Takri)のRangeTableが追加されました。これにより、GoのUnicodeサポートが拡張され、より多くの言語や文字体系を正確に処理できるようになります。
- 新しい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 構造体に CompressedSize64 と UncompressedSize64 が追加されたこと、bufio パッケージに WriteTo と ReadFrom メソッドが追加されたこと、bytes パッケージに Grow メソッドと WriteTo メソッドが追加されたこと、crypto/hmac に Equal 関数が追加されたこと、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構造体にCompressedSize64とUncompressedSize64フィールドが追加されました。これは、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構造体にSessionTicketKeyとSessionTicketsDisabledフィールドが追加されました。これらは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ファイル内のシンボル情報をより詳細に解析できるようになります。
- WindowsのPE(Portable Executable)ファイル形式のデバッグ情報に関する多くの型とフィールドが追加されました。これには
go/ast:CommentMapのUpdateメソッドのシグネチャが変更され、Node型の引数が2つになりました。これは、AST(Abstract Syntax Tree)のノードが更新された際に、コメントマップも適切に更新できるようにするための変更です。ChanType構造体にArrowフィールドが追加されました。これは、チャネル型の構文(<-chan Tやchan<- T)における矢印の位置を保持するためのものです。ChainNode、DotNode、FieldNode、IdentifierNode、NilNodeなど、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ヘッダで使用される日付/時刻文字列を解析するためのものです。ServeMuxにHandlerメソッドが追加されました。これは、特定のリクエストに対するハンドラとパスを返すものです。
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固有の機能や低レベルなシステム操作をサポートするためのものです。
- Darwin (macOS)、Linux、Windowsなど、様々なOSおよびアーキテクチャ向けの
testing:BenchmarkResult型にAllocedBytesPerOp、AllocsPerOp、MemStringメソッド、およびMemAllocs、MemBytesフィールドが追加されました。これらは、Goのベンチマークテストにおいて、メモリ割り当てに関する詳細な統計情報を取得するためのものです。これにより、メモリ使用量の最適化がより容易になります。
text/template/parse:- テンプレートのパースツリーにおけるノードの位置情報(
Pos)を扱うための多くの変更が加えられました。様々なノード型にPosition()メソッドが追加され、Tree構造体にErrorContextメソッドが追加されました。これにより、テンプレートの構文エラーが発生した際に、より正確なエラーメッセージと位置情報を提供できるようになります。
- テンプレートのパースツリーにおけるノードの位置情報(
unicode:- 新しいUnicodeスクリプト(例:
Chakma,Meroitic_Cursive,Miao,Sharada,Sora_Sompeng,Takri)のRangeTableが追加されました。これにより、GoのUnicodeサポートが拡張され、より多くの言語や文字体系を正確に処理できるようになります。
- 新しい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 構造体に CompressedSize64 と UncompressedSize64 が追加されたこと、bufio パッケージに WriteTo と ReadFrom メソッドが追加されたこと、bytes パッケージに Grow メソッドと WriteTo メソッドが追加されたこと、crypto/hmac に Equal 関数が追加されたこと、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のリリースノートなど、このコミットが関連するリリースについて言及されている可能性のあるもの)