[インデックス 15284] ファイルの概要
このコミットは、Go言語の標準ライブラリの次期リリースで導入される予定のAPI変更を記録する api/next.txt
ファイルを更新するものです。api/next.txt
は、GoプロジェクトにおけるAPI互換性保証の重要な一部であり、将来のリリースで追加される新しいエクスポートされたシンボル(関数、型、メソッド、定数など)を追跡するために使用されます。このファイルは通常、Goのソースコードから自動生成され、APIレビュープロセスの一環として定期的に更新されます。
このコミット自体は、Goのソースコードに直接的な機能変更を加えるものではなく、既存のコードベースにマージされたAPIの追加や変更を api/next.txt
に反映させるものです。したがって、このコミットに含まれる変更は、Go標準ライブラリの様々なパッケージにおける広範なAPI拡張を示しています。
コミット
commit 428c4cc8d4611c0ddbfe78416b63f77272dade56
Author: Russ Cox <rsc@golang.org>
Date: Fri Feb 15 16:33:14 2013 -0500
api: refresh next.txt
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/7317049
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/428c4cc8d4611c0ddbfe78416b63f77272dade56
元コミット内容
api: refresh next.txt
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/7317049
変更の背景
Go言語は、後方互換性を非常に重視しており、特に標準ライブラリのAPIについては厳格な互換性ポリシーを維持しています。新しいGoのバージョンがリリースされる際、既存のコードが新しいバージョンでも問題なく動作することを保証するため、APIの変更は慎重に管理されます。
api/next.txt
ファイルは、このAPI互換性管理プロセスの中核をなすものです。このファイルには、次のメジャーリリースで公開される予定のすべての新しいエクスポートされたAPIシンボルがリストアップされます。Go開発チームは、このファイルを定期的に更新し、新しいAPIが追加されるたびにレビューを行います。これにより、意図しないAPIの変更や、互換性を損なう可能性のある変更がリリース前に特定され、対処されます。
このコミットの背景は、まさにこの定期的なメンテナンスプロセスにあります。Goの標準ライブラリに新しい機能や改善がマージされると、それらの変更によって公開される新しいAPIが api/next.txt
に追加されます。このコミットは、それまでにマージされたAPI変更を api/next.txt
に「リフレッシュ」(反映)させることを目的としています。これは、Goのリリースサイクルにおいて、APIの安定性と予測可能性を維持するための標準的な手順です。
前提知識の解説
Go言語のAPI互換性ポリシー
Go言語のバージョン管理は、セマンティックバージョニングに似たアプローチを取っていますが、特に標準ライブラリのAPIについては「Go 1 Compatibility Promise」という厳格なポリシーがあります。これは、Go 1.xリリースでは、Go 1で書かれたプログラムがGo 1.xの新しいバージョンでもコンパイルされ、実行されることを保証するというものです。このポリシーは、Goエコシステムの安定性と開発者の信頼を維持するために不可欠です。
api/next.txt
と api/current.txt
Goのソースツリーには、api/current.txt
と api/next.txt
という2つの重要なファイルが存在します。
api/current.txt
: 現在リリースされているGoのバージョン(例: Go 1.x)で利用可能なすべてのエクスポートされたAPIシンボルをリストアップしています。このファイルは、Go 1 Compatibility Promiseの基準点となります。api/next.txt
: 次のメジャーリリース(例: Go 1.x+1)で導入される予定の新しいAPIシンボルをリストアップしています。開発中の新しいAPIはまずこのファイルに追加され、レビューを経て最終的にリリース版のAPIとなります。
これらのファイルは、go tool api
コマンドによってGoのソースコードから自動的に生成されます。開発者は、新しいAPIを追加するプルリクエストを提出する際に、このツールを使って api/next.txt
を更新し、その変更をレビューしてもらう必要があります。
GoのパッケージとAPI
Goの標準ライブラリは、archive/tar
、crypto/tls
、net/http
、syscall
など、多数のパッケージに分かれています。各パッケージは特定の機能を提供し、その機能はエクスポートされた(大文字で始まる)関数、型、メソッド、定数、変数を通じて外部に公開されます。このコミットで api/next.txt
に追加されているエントリは、これらのパッケージに新しいエクスポートされたシンボルが追加されたことを意味します。
技術的詳細
このコミットは、api/next.txt
に160行の追加を行っています。これらの追加は、Go標準ライブラリの様々なパッケージにおけるAPIの拡張を反映しています。主な変更の種類と、その技術的な意味合いを以下に示します。
-
新しい定数 (const):
pkg archive/tar, const TypeGNULongLink ideal-char
pkg archive/tar, const TypeGNULongName ideal-char
pkg crypto/tls, const TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA uint16
pkg crypto/x509, const ExtKeyUsageMicrosoftServerGatedCrypto ExtKeyUsage
これらの定数は、特定のプロトコル、ファイル形式、またはアルゴリズムに関連する新しいオプションや識別子を提供します。例えば、archive/tar
の定数は、GNU tar拡張で使われる長いファイル名やリンク名を扱うための新しいタイプを示唆しています。
-
新しい関数 (func):
pkg bytes, func TrimPrefix([]uint8, []uint8) []uint8
pkg bytes, func TrimSuffix([]uint8, []uint8) []uint8
pkg crypto/x509, func DecryptPEMBlock(*pem.Block, []uint8) ([]uint8, error)
pkg runtime/debug, func FreeOSMemory()
新しい関数は、特定のタスクを実行するための新しいユーティリティや操作を提供します。bytes.TrimPrefix
とbytes.TrimSuffix
は、バイトスライスからプレフィックスやサフィックスを効率的に削除するための一般的な操作です。runtime/debug.FreeOSMemory()
は、GoランタイムがOSにメモリを解放するようヒントを与えるための関数で、メモリ使用量の最適化に役立ちます。
-
新しいメソッド (method):
pkg archive/tar, method (*Header) FileInfo() os.FileInfo
pkg bufio, method (*Reader) WriteTo(io.Writer) (int64, error)
pkg encoding/json, method (*Decoder) Buffered() io.Reader
pkg go/types, method (*Array) String() string
(多数のString()
メソッド) 既存の型に新しい振る舞いを追加します。例えば、archive/tar.Header
にFileInfo()
メソッドが追加されたことで、tarヘッダーからos.FileInfo
インターフェースを実装するオブジェクトを簡単に取得できるようになり、ファイル情報の抽象化が向上します。go/types
パッケージにおける多数のString()
メソッドの追加は、型情報のデバッグや表示を容易にするためのものです。
-
新しい型 (type):
pkg crypto/x509, type SystemRootsError struct
pkg database/sql/driver, type Queryer interface
pkg go/types, type Importer func(map[string]*Package, string) (*Package, error)
pkg runtime/debug, type GCStats struct
新しい型は、新しいデータ構造、インターフェース、または関数シグネチャを定義します。database/sql/driver.Queryer
インターフェースは、データベースドライバがクエリを実行するための標準的な契約を提供し、より柔軟なデータベース操作を可能にします。runtime/debug.GCStats
は、ガベージコレクションの統計情報を取得するための構造体で、Goアプリケーションのパフォーマンスプロファイリングに役立ちます。
-
既存の構造体への新しいフィールド:
pkg archive/zip, type FileHeader struct, CompressedSize64 uint64
pkg crypto/tls, type Config struct, PreferServerCipherSuites bool
pkg crypto/x509, type Certificate struct, IPAddresses []net.IP
pkg net/http, type Server struct, TLSNextProto map[string]func(*Server, *tls.Conn, Handler)
既存のデータ構造に新しい情報や設定オプションを追加します。archive/zip.FileHeader
へのCompressedSize64
とUncompressedSize64
の追加は、ZIP64形式のサポートを示唆しており、4GBを超えるサイズのファイルを扱えるようになります。crypto/tls.Config
のPreferServerCipherSuites
は、TLSハンドシェイクにおいてサーバーが自身の暗号スイートの順序を優先するかどうかを制御するもので、セキュリティ設定の柔軟性を高めます。
-
プラットフォーム固有の
syscall
変更:pkg syscall (linux-386), const SizeofTCPInfo ideal-int
pkg syscall (linux-386), func Accept4(int, int) (int, Sockaddr, error)
pkg syscall (linux-386), type TCPInfo struct
(およびその多数のフィールド) Linuxの様々なアーキテクチャ(386, amd64, arm)におけるsyscall
パッケージへの大量の追加は、OSレベルの機能へのより深いアクセスを提供します。特にTCPInfo
構造体とそのフィールドの追加は、TCPソケットに関する詳細な統計情報(再送回数、RTT、輻輳ウィンドウなど)をGoプログラムから取得できるようになることを意味し、ネットワークアプリケーションのデバッグや最適化に非常に有用です。Accept4
は、ソケットを受け入れる際にフラグを指定できるシステムコールで、より高度なソケット操作を可能にします。
これらの変更は、Go標準ライブラリが継続的に進化し、より多くの機能、より良いパフォーマンス、そしてより詳細な制御を提供しようとしていることを示しています。特に、ネットワーク、暗号、ファイルアーカイブ、そして言語ツール(go/ast
, go/types
など)の分野で顕著な拡張が見られます。
コアとなるコードの変更箇所
このコミットの「コアとなるコードの変更箇所」は、api/next.txt
ファイルへの追加行そのものです。このファイルは、GoのAPIの定義をテキスト形式で表現しており、各行が新しいエクスポートされたシンボルを表します。
以下に、追加された行の一部を抜粋して示します。これらの行は、Goの標準ライブラリに新しいAPIが追加されたことを示しています。
--- a/api/next.txt
+++ b/api/next.txt
@@ -1,15 +1,21 @@
+pkg archive/tar, const TypeGNULongLink ideal-char
+pkg archive/tar, const TypeGNULongName ideal-char
pkg archive/tar, func FileInfoHeader(os.FileInfo, string) (*Header, error)
+pkg archive/tar, method (*Header) FileInfo() os.FileInfo
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, func TrimPrefix([]uint8, []uint8) []uint8
+pkg bytes, func TrimSuffix([]uint8, []uint8) []uint8
pkg bytes, method (*Buffer) Grow(int)
pkg bytes, method (*Reader) WriteTo(io.Writer) (int64, error)
pkg crypto/hmac, func Equal([]uint8, []uint8) 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, PreferServerCipherSuites bool
pkg crypto/tls, type Config struct, SessionTicketKey [32]uint8
pkg crypto/tls, type Config struct, SessionTicketsDisabled bool
pkg crypto/tls, type ConnectionState struct, DidResume bool
@@ -21,6 +27,8 @@ pkg crypto/x509, const ECDSAWithSHA512 SignatureAlgorithm
pkg crypto/x509, const ExtKeyUsageIPSECEndSystem ExtKeyUsage
pkg crypto/x509, const ExtKeyUsageIPSECTunnel ExtKeyUsage
pkg crypto/x509, const ExtKeyUsageIPSECUser ExtKeyUsage
+pkg crypto/x509, const ExtKeyUsageMicrosoftServerGatedCrypto ExtKeyUsage
+pkg crypto/x509, const ExtKeyUsageNetscapeServerGatedCrypto ExtKeyUsage
pkg crypto/x509, const IncompatibleUsage InvalidReason
pkg crypto/x509, const PEMCipher3DES PEMCipher
pkg crypto/x509, const PEMCipherAES128 PEMCipher
@@ -31,9 +39,14 @@ pkg crypto/x509, func DecryptPEMBlock(*pem.Block, []uint8) ([]uint8, error)\n pkg crypto/x509, func EncryptPEMBlock(io.Reader, string, []uint8, []uint8, PEMCipher) (*pem.Block, error)\n pkg crypto/x509, func IsEncryptedPEMBlock(*pem.Block) bool\n pkg crypto/x509, func ParseECPrivateKey([]uint8) (*ecdsa.PrivateKey, error)\n+pkg crypto/x509, method (SystemRootsError) Error() string\n+pkg crypto/x509, type Certificate struct, IPAddresses []net.IP\n pkg crypto/x509, type PEMCipher int\n+pkg crypto/x509, type SystemRootsError struct\n pkg crypto/x509, type VerifyOptions struct, KeyUsages []ExtKeyUsage\n pkg crypto/x509, var IncorrectPasswordError error
+pkg database/sql/driver, type Queryer interface { Query }\n+pkg database/sql/driver, type Queryer interface, Query(string, []Value) (Rows, error)\n pkg debug/elf, method (*File) DynString(DynTag) ([]string, error)\n pkg debug/elf, type FileHeader struct, Entry uint64
コアとなるコードの解説
api/next.txt
の各行は、GoのAPIにおける新しいエクスポートされたシンボルを記述しています。フォーマットは通常 pkg <パッケージ名>, <シンボルタイプ> <シンボル名> <追加情報>
となっています。
いくつか例を挙げて解説します。
-
pkg archive/tar, const TypeGNULongLink ideal-char
- パッケージ:
archive/tar
- シンボルタイプ:
const
(定数) - シンボル名:
TypeGNULongLink
- 追加情報:
ideal-char
(この定数の型が文字型であることを示唆) - 解説:
archive/tar
パッケージに、GNU tar形式で長いリンク名を扱うための新しい定数TypeGNULongLink
が追加されたことを意味します。これにより、Goのarchive/tar
ライブラリがGNU tarの特定の拡張機能をより適切にサポートできるようになります。
- パッケージ:
-
pkg bytes, func TrimPrefix([]uint8, []uint8) []uint8
- パッケージ:
bytes
- シンボルタイプ:
func
(関数) - シンボル名:
TrimPrefix
- 追加情報:
([]uint8, []uint8) []uint8
(引数と戻り値の型シグネチャ) - 解説:
bytes
パッケージに、バイトスライスから指定されたプレフィックスを削除する新しい関数TrimPrefix
が追加されたことを示します。これは、文字列操作におけるstrings.TrimPrefix
と同様の機能を提供しますが、バイトスライスに特化しています。
- パッケージ:
-
pkg crypto/tls, type Config struct, PreferServerCipherSuites bool
- パッケージ:
crypto/tls
- シンボルタイプ:
type
(型) - シンボル名:
Config struct
(Config構造体) - 追加情報:
PreferServerCipherSuites bool
(追加されたフィールド名と型) - 解説:
crypto/tls
パッケージのConfig
構造体に、新しいブール型フィールドPreferServerCipherSuites
が追加されたことを意味します。このフィールドをtrue
に設定すると、TLSサーバーはクライアントが提示する暗号スイートの順序ではなく、自身が設定した暗号スイートの順序を優先するようになります。これは、サーバー側のセキュリティポリシーをより厳密に適用するために重要です。
- パッケージ:
-
pkg syscall (linux-386), type TCPInfo struct
- パッケージ:
syscall
(Linux 386アーキテクチャ向け) - シンボルタイプ:
type
(型) - シンボル名:
TCPInfo struct
- 解説: Linux 386アーキテクチャ向けの
syscall
パッケージに、TCPInfo
という新しい構造体が追加されたことを示します。この構造体は、TCPソケットに関する詳細な統計情報(例: RTT、再送数、輻輳ウィンドウなど)を保持するために使用されます。これにより、Goプログラムから低レベルのネットワーク情報を取得し、ネットワークの診断や最適化を行うことが可能になります。
- パッケージ:
これらのエントリは、Goの標準ライブラリが継続的に拡張され、より多くの機能とより詳細な制御を提供していることを明確に示しています。
関連リンク
- Go 1 Compatibility Promise: https://go.dev/doc/go1compat
go tool api
コマンドのドキュメント (Goの公式ドキュメント内で検索): https://go.dev/cmd/go/#hdr-Go_API_checker- Go言語の標準ライブラリドキュメント: https://pkg.go.dev/std
参考にした情報源リンク
- Go言語の公式ドキュメント
- Go言語のソースコードリポジトリ (GitHub)
- Go言語のメーリングリストやIssueトラッカー (特定のAPI変更の背景を理解するため)