[インデックス 18574] ファイルの概要
このコミットは、Go言語の次期リリースで導入される予定のAPI変更を記録するapi/next.txt
ファイルを更新するものです。api/next.txt
は、GoのAPI互換性ポリシーにおいて重要な役割を果たすファイルであり、Goの将来のバージョンで利用可能になる新しい公開API要素(関数、型、メソッド、定数など)を列挙しています。このファイルに記載されたAPIは、Go 1の互換性保証の対象となり、将来のバージョンで削除されたり、互換性のない変更が加えられたりすることはありません。
コミット
commit 15c1ab646daab5813c406355311dd89573e0c011
Author: Russ Cox <rsc@golang.org>
Date: Wed Feb 19 15:56:42 2014 -0500
api: update next.txt
LGTM=bradfitz
R=bradfitz
CC=golang-codereviews
https://golang.org/cl/66160043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/15c1ab646daab5813c406355311dd89573e0c011
元コミット内容
このコミットの元々の内容は、api/next.txt
ファイルを更新し、Goの次期リリースで追加される新しいAPI要素を反映させることです。具体的には、以下のパッケージに新しい型、関数、メソッド、定数が追加されています。
archive/tar
crypto/tls
crypto/x509
crypto/x509/pkix
debug/dwarf
(既存の定数に新しい値)debug/goobj
(既存の型に新しいフィールド)debug/macho
(新規追加のパッケージと関連API)debug/plan9obj
(既存の型に新しいフィールド)encoding/asn1
go/build
math/big
sync
(既存のメソッドに新しい引数)syscall
(windows-amd64固有の型に新しいフィールド)testing
unicode
変更の背景
Go言語は、後方互換性を非常に重視しています。Go 1のリリース以降、既存の公開APIは原則として変更されないという互換性保証が提供されています。しかし、言語や標準ライブラリの進化に伴い、新しい機能や改善された機能を提供するために、新しいAPIを追加する必要が生じます。
api/next.txt
ファイルは、このような新しいAPIを記録するためのメカニズムです。開発者が新しいAPIを提案し、それがレビュープロセスを経て承認されると、まずこのファイルにそのAPIが追加されます。これにより、Goのリリースサイクルにおいて、どのAPIが次期バージョンで追加される予定であるかを明確にし、互換性保証の対象とすることができます。
このコミットは、当時のGo開発における様々な機能追加や改善が進行していた時期に、それらの変更に伴って導入される新しいAPIをapi/next.txt
に反映させるために行われました。特に、暗号化関連の機能強化(crypto/x509
)、デバッグツールの改善(debug/macho
)、並列テストのサポート(testing
)、大きな数値のテキストエンコーディング(math/big
)などが含まれており、これらはGo言語の汎用性と堅牢性を高めるための重要なステップでした。
前提知識の解説
このコミットの変更内容を理解するためには、以下の前提知識が役立ちます。
- Go言語のAPI互換性保証: Go 1以降、Go言語は厳格な後方互換性ポリシーを維持しています。これは、既存の公開APIが将来のバージョンで変更または削除されないことを保証するものです。これにより、Goプログラムは新しいGoバージョンにアップグレードしても、既存のコードが動作し続けることが期待できます。
api/next.txt
はこの互換性保証の対象となる新しいAPIを記録するものです。 - Goの標準ライブラリ: Goは豊富な標準ライブラリを提供しており、ネットワーキング、暗号化、ファイルI/O、データ構造など、幅広いタスクに対応しています。このコミットで追加されるAPIは、これらの標準ライブラリの既存パッケージを拡張するか、新しいパッケージを導入するものです。
- X.509証明書とCSR:
crypto/x509
パッケージは、X.509証明書と公開鍵基盤(PKI)に関連する機能を提供します。X.509証明書は、公開鍵の所有者を検証するために使用されるデジタル証明書です。CSR(Certificate Signing Request)は、証明書発行機関(CA)にデジタル証明書を要求するために使用されるファイルです。CSRには、公開鍵と、証明書に含める情報(組織名、ドメイン名など)が含まれます。 - Mach-Oファイル形式: Mach-O(Mach object)は、macOS、iOS、watchOS、tvOSなどのAppleのオペレーティングシステムで使用される実行可能ファイル、オブジェクトコード、共有ライブラリ、ダイナミックロード可能バンドル、およびコアダンプのファイル形式です。
debug/macho
パッケージは、これらのファイルを解析するための機能を提供します。 math/big
パッケージ:math/big
パッケージは、任意精度の整数(Int
)、有理数(Rat
)、浮動小数点数(Float
)を扱うための機能を提供します。これらの型は、標準のGoの組み込み型では表現できない非常に大きな数値や、高い精度が要求される計算に使用されます。testing
パッケージと並列テスト: Goのtesting
パッケージは、ユニットテストとベンチマークテストを記述するためのフレームワークを提供します。並列テストは、複数のテストを同時に実行することで、テストスイートの実行時間を短縮する手法です。
技術的詳細
このコミットでapi/next.txt
に追加された主要なAPI変更について、技術的な詳細を掘り下げます。
crypto/x509
パッケージの拡張
このコミットでは、crypto/x509
パッケージにCertificateRequest
に関連する多くのAPIが追加されています。
type CertificateRequest struct
: これは、X.509証明書署名要求(CSR)の構造を表す新しい型です。CSRには、公開鍵、サブジェクト名(組織名、コモンネームなど)、およびオプションの拡張情報が含まれます。この構造体には、PublicKey
、Subject
、DNSNames
、EmailAddresses
、IPAddresses
、Extensions
、Signature
など、CSRの様々な要素を表現するフィールドが含まれています。func CreateCertificateRequest(io.Reader, *CertificateRequest, interface{}) ([]uint8, error)
: この関数は、与えられたCertificateRequest
構造体と秘密鍵を使用して、DERエンコードされたCSRを作成します。io.Reader
は乱数ジェネレータとして使用され、interface{}
は署名に使用する秘密鍵(crypto.Signer
インターフェースを実装する型)です。func ParseCertificateRequest([]uint8) (*CertificateRequest, error)
: この関数は、DERエンコードされたCSRバイト列を解析し、CertificateRequest
構造体に変換します。
これらのAPIの追加により、Goアプリケーション内でCSRをプログラム的に生成および解析する機能が提供されます。これは、TLSクライアント認証、コード署名、VPNなどのPKI関連のアプリケーションを構築する際に非常に有用です。
debug/macho
パッケージの追加
このコミットで最も大きな追加の一つは、debug/macho
パッケージの導入です。このパッケージは、Mach-O形式のバイナリファイルを解析するための機能を提供します。
type FatFile struct
: Mach-Oファイルは、複数のアーキテクチャ(例: x86_64とARM64)のバイナリを1つのファイルにまとめることができる「Fatバイナリ」として存在することがあります。FatFile
構造体は、このようなFatバイナリ全体を表し、含まれる各アーキテクチャのバイナリ(FatArch
)へのアクセスを提供します。type FatArch struct
:FatArch
構造体は、Fatバイナリ内の特定のアーキテクチャに対応するMach-Oバイナリを表します。これには、そのバイナリのオフセット、サイズ、CPUタイプなどの情報が含まれます。func NewFatFile(io.ReaderAt) (*FatFile, error)
:io.ReaderAt
からFatバイナリを読み込み、FatFile
構造体を構築します。func OpenFat(string) (*FatFile, error)
: 指定されたパスのFatバイナリファイルを開き、FatFile
構造体を返します。- メソッド群:
FatFile
とFatArch
には、バイナリ内のセクション、セグメント、インポートされたライブラリ、シンボル、DWARFデバッグ情報などにアクセスするための多くのメソッドが追加されています。
debug/macho
パッケージの追加は、Go言語でmacOS/iOSアプリケーションのデバッグツール、プロファイラ、またはバイナリ解析ツールを開発する上で非常に重要です。これにより、GoプログラムがMach-Oバイナリの内部構造を理解し、操作できるようになります。
math/big
パッケージのテキストエンコーディング
math/big
パッケージのInt
とRat
型にMarshalText()
とUnmarshalText()
メソッドが追加されています。
MarshalText() ([]uint8, error)
: このメソッドは、Int
またはRat
の値をテキスト形式(通常は10進数文字列)に変換します。これは、JSONやXMLなどのテキストベースのデータ形式で大きな数値を表現する際に便利です。UnmarshalText([]uint8) error
: このメソッドは、テキスト形式のバイト列を解析し、Int
またはRat
の値に変換します。
これらのメソッドは、encoding.TextMarshaler
およびencoding.TextUnmarshaler
インターフェースを実装しており、Goの標準的なエンコーディングメカニズムとシームレスに統合されます。これにより、任意精度の数値をテキストとして簡単にシリアライズおよびデシリアライズできるようになります。
testing
パッケージの並列テストサポート
testing
パッケージには、ベンチマークテストの並列実行をサポートするためのAPIが追加されています。
method (*B) RunParallel(func(*PB))
: このメソッドは、ベンチマークテストのサブテストを並列に実行するために使用されます。引数として渡される関数は、各並列ゴルーチンで実行されるテストロジックを含みます。method (*B) SetParallelism(int)
: このメソッドは、RunParallel
で同時に実行されるゴルーチンの最大数を設定します。type PB struct
:RunParallel
に渡される関数に提供される型で、並列ベンチマークのイテレーションを制御するためのNext()
メソッドを持ちます。method (*PB) Next() bool
:PB
のNext()
メソッドは、次のベンチマークイテレーションに進むべきかどうかを返します。これは、並列ベンチマークループの条件として使用されます。
これらのAPIにより、Goのベンチマークテストは、マルチコアプロセッサを最大限に活用して、より効率的に実行できるようになります。これは、パフォーマンスが重要なコードのボトルネックを特定し、最適化する上で非常に有用です。
その他の変更
archive/tar
:Header
構造体にXattrs map[string]string
フィールドが追加され、tarアーカイブ内のファイルの拡張属性(extended attributes)をサポートします。crypto/tls
: クライアントセッションキャッシュを管理するためのClientSessionCache
インターフェースと関連する関数が追加され、TLSハンドシェイクのパフォーマンスを向上させます。encoding/asn1
:ObjectIdentifier
型にString()
メソッドが追加され、ASN.1オブジェクト識別子を人間が読める文字列形式で表現できるようになります。go/build
:Package
構造体にMFiles []string
フィールドが追加され、Goモジュールに関連するファイルの管理が改善されます。unicode
:Version
定数が更新され、Unicodeの新しいバージョン(当時)に対応します。
コアとなるコードの変更箇所
このコミットのコアとなる変更は、api/next.txt
ファイルの内容そのものです。このファイルは、GoのビルドシステムによってGoの公開APIの変更を追跡するために使用されます。
--- a/api/next.txt
+++ b/api/next.txt
@@ -1,9 +1,32 @@
+pkg archive/tar, type Header struct, Xattrs map[string]string
pkg crypto/tls, func NewLRUClientSessionCache(int) ClientSessionCache
pkg crypto/tls, type ClientSessionCache interface { Get, Put }
pkg crypto/tls, type ClientSessionCache interface, Get(string) (*ClientSessionState, bool)
pkg crypto/tls, type ClientSessionCache interface, Put(string, *ClientSessionState)
pkg crypto/tls, type ClientSessionState struct
pkg crypto/tls, type Config struct, ClientSessionCache ClientSessionCache
+pkg crypto/x509, func CreateCertificateRequest(io.Reader, *CertificateRequest, interface{}) ([]uint8, error)
+pkg crypto/x509, func ParseCertificateRequest([]uint8) (*CertificateRequest, error)
+pkg crypto/x509, type CertificateRequest struct
+pkg crypto/x509, type CertificateRequest struct, Attributes []pkix.AttributeTypeAndValueSET
+pkg crypto/x509, type CertificateRequest struct, DNSNames []string
+pkg crypto/x509, type CertificateRequest struct, EmailAddresses []string
+pkg crypto/x509, type CertificateRequest struct, Extensions []pkix.Extension
+pkg crypto/x509, type CertificateRequest struct, ExtraExtensions []pkix.Extension
+pkg crypto/x509, type CertificateRequest struct, IPAddresses []net.IP
+pkg crypto/x509, type CertificateRequest struct, PublicKey interface{}
+pkg crypto/x509, type CertificateRequest struct, PublicKeyAlgorithm PublicKeyAlgorithm
+pkg crypto/x509, type CertificateRequest struct, Raw []uint8
+pkg crypto/x509, type CertificateRequest struct, RawSubject []uint8
+pkg crypto/x509, type CertificateRequest struct, RawSubjectPublicKeyInfo []uint8
+pkg crypto/x509, type CertificateRequest struct, RawTBSCertificateRequest []uint8
+pkg crypto/x509, type CertificateRequest struct, Signature []uint8
+pkg crypto/x509, type CertificateRequest struct, SignatureAlgorithm SignatureAlgorithm
+pkg crypto/x509, type CertificateRequest struct, Subject pkix.Name
+pkg crypto/x509, type CertificateRequest struct, Version int
+pkg crypto/x509/pkix, type AttributeTypeAndValueSET struct
+pkg crypto/x509/pkix, type AttributeTypeAndValueSET struct, Type asn1.ObjectIdentifier
+pkg crypto/x509/pkix, type AttributeTypeAndValueSET struct, Value [][]AttributeTypeAndValue
pkg debug/dwarf, const TagCondition = 63
pkg debug/dwarf, const TagCondition Tag
pkg debug/dwarf, const TagRvalueReferenceType = 66
@@ -130,6 +153,34 @@ pkg debug/goobj, type Var struct, Kind int
pkg debug/goobj, type Var struct, Name string
pkg debug/goobj, type Var struct, Offset int
pkg debug/goobj, type Var struct, Type SymID
+pkg debug/macho, const MagicFat = 3405691582
+pkg debug/macho, const MagicFat uint32
+pkg debug/macho, const TypeBundle = 8
+pkg debug/macho, const TypeDylib = 6
+pkg debug/macho, const TypeDylib Type
+pkg debug/macho, func NewFatFile(io.ReaderAt) (*FatFile, error)
+pkg debug/macho, func OpenFat(string) (*FatFile, error)
+pkg debug/macho, method (*FatFile) Close() error
+pkg debug/macho, method (FatArch) Close() error
+pkg debug/macho, method (FatArch) DWARF() (*dwarf.Data, error)
+pkg debug/macho, method (FatArch) ImportedLibraries() ([]string, error)
+pkg debug/macho, method (FatArch) ImportedSymbols() ([]string, error)
+pkg debug/macho, method (FatArch) Section(string) *Section
+pkg debug/macho, method (FatArch) Segment(string) *Segment
+pkg debug/macho, type FatArch struct
+pkg debug/macho, type FatArch struct, embedded *File
+pkg debug/macho, type FatArch struct, embedded FatArchHeader
+pkg debug/macho, type FatArchHeader struct
+pkg debug/macho, type FatArchHeader struct, Align uint32
+pkg debug/macho, type FatArchHeader struct, Cpu Cpu
+pkg debug/macho, type FatArchHeader struct, Offset uint32
+pkg debug/macho, type FatArchHeader struct, Size uint32
+pkg debug/macho, type FatArchHeader struct, SubCpu uint32
+pkg debug/macho, type FatFile struct
+pkg debug/macho, type FatFile struct, Arches []FatArch
+pkg debug/macho, type FatFile struct, Magic uint32
+pkg debug/macho, var ErrNotFat *FormatError
pkg debug/plan9obj, func NewFile(io.ReaderAt) (*File, error)
pkg debug/plan9obj, func Open(string) (*File, error)
pkg debug/plan9obj, method (*File) Close() error
@@ -174,6 +225,12 @@ pkg debug/plan9obj, type Sym struct
pkg debug/plan9obj, type Sym struct, Name string
pkg debug/plan9obj, type Sym struct, Type int32
pkg debug/plan9obj, type Sym struct, Value uint64
+pkg encoding/asn1, method (ObjectIdentifier) String() string
+pkg go/build, type Package struct, MFiles []string
+pkg math/big, method (*Int) MarshalText() ([]uint8, error)
+pkg math/big, method (*Int) UnmarshalText([]uint8) error
+pkg math/big, method (*Rat) MarshalText() ([]uint8, error)
+pkg math/big, method (*Rat) UnmarshalText([]uint8) error
pkg sync, method (*Pool) Get() interface{}
pkg sync, method (*Pool) Put(interface{})
pkg sync, type Pool struct
@@ -1392,3 +1449,8 @@ pkg syscall (windows-amd64), type TCPKeepalive struct
pkg syscall (windows-amd64), type TCPKeepalive struct, Interval uint32
pkg syscall (windows-amd64), type TCPKeepalive struct, OnOff uint32
pkg syscall (windows-amd64), type TCPKeepalive struct, Time uint32
+pkg testing, method (*B) RunParallel(func(*PB))
+pkg testing, method (*B) SetParallelism(int)
+pkg testing, method (*PB) Next() bool
+pkg testing, type PB struct
+pkg unicode, const Version = "6.3.0"
コアとなるコードの解説
api/next.txt
ファイルは、Goの公開APIの「スナップショット」のようなものです。各行は、Goの標準ライブラリに追加される新しい公開API要素を記述しています。フォーマットは通常、pkg <package_path>, <element_type> <element_name> [details]
のようになります。
このコミットでは、特に以下の重要なAPIが追加されています。
pkg crypto/x509, type CertificateRequest struct
および関連関数:- これは、X.509証明書署名要求(CSR)をGoで直接操作するための基盤を提供します。以前は、CSRの生成や解析には外部ライブラリやシェルコマンドに頼る必要がありましたが、この追加によりGoの標準ライブラリ内で完結できるようになりました。これにより、GoでPKI関連のツールやサービスを構築する際の利便性とセキュリティが向上します。
pkg debug/macho, ...
:debug/macho
パッケージは、macOSやiOSの実行可能ファイル形式であるMach-OファイルをGoで解析するためのものです。これは、Goでデバッガ、プロファイラ、またはバイナリ解析ツールを開発する際に不可欠な機能です。例えば、Goで書かれたツールが、macOSアプリケーションのシンボルテーブルを読み取ったり、セクション情報を抽出したりすることが可能になります。
pkg math/big, method (*Int) MarshalText() ([]uint8, error)
およびUnmarshalText()
:math/big
パッケージは任意精度の数値を扱いますが、これらの数値をテキスト形式(例: JSONやXML)でシリアライズ・デシリアライズする標準的な方法が提供されていませんでした。MarshalText
とUnmarshalText
の追加により、encoding.TextMarshaler
とencoding.TextUnmarshaler
インターフェースが実装され、Goの標準的なエンコーディングメカニズムと統合されることで、大きな数値を扱うアプリケーションでのデータ交換が容易になります。
pkg testing, method (*B) RunParallel(func(*PB))
および関連API:- Goのベンチマークテストは、単一のゴルーチンで実行されていましたが、この変更により、複数のゴルーチンで並列にベンチマークを実行できるようになりました。これは、マルチコア環境でのコードのパフォーマンス特性をより正確に評価するために非常に重要です。例えば、並行処理のボトルネックを特定したり、並行アルゴリズムのスケーラビリティを測定したりする際に役立ちます。
これらのAPIの追加は、Go言語がより広範なユースケースに対応し、特にシステムプログラミング、セキュリティ、デバッグ、および高性能コンピューティングの分野での能力を強化するための重要なステップでした。
関連リンク
- Go言語の互換性保証: https://go.dev/doc/go1compat
- Goの
crypto/x509
パッケージドキュメント: https://pkg.go.dev/crypto/x509 - Goの
debug/macho
パッケージドキュメント: https://pkg.go.dev/debug/macho - Goの
math/big
パッケージドキュメント: https://pkg.go.dev/math/big - Goの
testing
パッケージドキュメント: https://pkg.go.dev/testing
参考にした情報源リンク
- Go言語の公式ドキュメント
- Goのソースコードリポジトリ
- Goのコードレビューシステム(Gerrit)の該当コミットページ
- Goのメーリングリストやフォーラムでの議論(一般的なGoのAPI設計原則や特定の機能に関する議論)
- X.509証明書、CSR、Mach-Oファイル形式、並列テストに関する一般的な技術情報