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

[インデックス 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には、公開鍵、サブジェクト名(組織名、コモンネームなど)、およびオプションの拡張情報が含まれます。この構造体には、PublicKeySubjectDNSNamesEmailAddressesIPAddressesExtensionsSignatureなど、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構造体を返します。
  • メソッド群: FatFileFatArchには、バイナリ内のセクション、セグメント、インポートされたライブラリ、シンボル、DWARFデバッグ情報などにアクセスするための多くのメソッドが追加されています。

debug/machoパッケージの追加は、Go言語でmacOS/iOSアプリケーションのデバッグツール、プロファイラ、またはバイナリ解析ツールを開発する上で非常に重要です。これにより、GoプログラムがMach-Oバイナリの内部構造を理解し、操作できるようになります。

math/bigパッケージのテキストエンコーディング

math/bigパッケージのIntRat型に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: PBNext()メソッドは、次のベンチマークイテレーションに進むべきかどうかを返します。これは、並列ベンチマークループの条件として使用されます。

これらの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)でシリアライズ・デシリアライズする標準的な方法が提供されていませんでした。MarshalTextUnmarshalTextの追加により、encoding.TextMarshalerencoding.TextUnmarshalerインターフェースが実装され、Goの標準的なエンコーディングメカニズムと統合されることで、大きな数値を扱うアプリケーションでのデータ交換が容易になります。
  • pkg testing, method (*B) RunParallel(func(*PB)) および関連API:
    • Goのベンチマークテストは、単一のゴルーチンで実行されていましたが、この変更により、複数のゴルーチンで並列にベンチマークを実行できるようになりました。これは、マルチコア環境でのコードのパフォーマンス特性をより正確に評価するために非常に重要です。例えば、並行処理のボトルネックを特定したり、並行アルゴリズムのスケーラビリティを測定したりする際に役立ちます。

これらのAPIの追加は、Go言語がより広範なユースケースに対応し、特にシステムプログラミング、セキュリティ、デバッグ、および高性能コンピューティングの分野での能力を強化するための重要なステップでした。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Goのソースコードリポジトリ
  • Goのコードレビューシステム(Gerrit)の該当コミットページ
  • Goのメーリングリストやフォーラムでの議論(一般的なGoのAPI設計原則や特定の機能に関する議論)
  • X.509証明書、CSR、Mach-Oファイル形式、並列テストに関する一般的な技術情報