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

[インデックス 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.txtapi/current.txt

Goのソースツリーには、api/current.txtapi/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/tarcrypto/tlsnet/httpsyscall など、多数のパッケージに分かれています。各パッケージは特定の機能を提供し、その機能はエクスポートされた(大文字で始まる)関数、型、メソッド、定数、変数を通じて外部に公開されます。このコミットで api/next.txt に追加されているエントリは、これらのパッケージに新しいエクスポートされたシンボルが追加されたことを意味します。

技術的詳細

このコミットは、api/next.txt に160行の追加を行っています。これらの追加は、Go標準ライブラリの様々なパッケージにおけるAPIの拡張を反映しています。主な変更の種類と、その技術的な意味合いを以下に示します。

  1. 新しい定数 (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拡張で使われる長いファイル名やリンク名を扱うための新しいタイプを示唆しています。
  2. 新しい関数 (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.TrimPrefixbytes.TrimSuffix は、バイトスライスからプレフィックスやサフィックスを効率的に削除するための一般的な操作です。runtime/debug.FreeOSMemory() は、GoランタイムがOSにメモリを解放するようヒントを与えるための関数で、メモリ使用量の最適化に役立ちます。
  3. 新しいメソッド (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.HeaderFileInfo() メソッドが追加されたことで、tarヘッダーから os.FileInfo インターフェースを実装するオブジェクトを簡単に取得できるようになり、ファイル情報の抽象化が向上します。go/types パッケージにおける多数の String() メソッドの追加は、型情報のデバッグや表示を容易にするためのものです。
  4. 新しい型 (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アプリケーションのパフォーマンスプロファイリングに役立ちます。
  5. 既存の構造体への新しいフィールド:

    • 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 への CompressedSize64UncompressedSize64 の追加は、ZIP64形式のサポートを示唆しており、4GBを超えるサイズのファイルを扱えるようになります。crypto/tls.ConfigPreferServerCipherSuites は、TLSハンドシェイクにおいてサーバーが自身の暗号スイートの順序を優先するかどうかを制御するもので、セキュリティ設定の柔軟性を高めます。
  6. プラットフォーム固有の 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言語の公式ドキュメント
  • Go言語のソースコードリポジトリ (GitHub)
  • Go言語のメーリングリストやIssueトラッカー (特定のAPI変更の背景を理解するため)