[インデックス 13627] ファイルの概要
このコミットは、Go言語の標準ライブラリのAPI変更を追跡するためのファイルである api/next.txt
に、最近追加されたAPI要素を記録するものです。Go言語では、後方互換性を非常に重視しており、APIの変更は厳格に管理されています。api/next.txt
は、次のメジャーリリースで導入される予定のAPI変更を一覧化し、開発者が将来の変更を把握できるようにするための重要なドキュメントです。このコミットにより、bytes.Buffer
の Grow
メソッド、debug/elf
の DynString
メソッド、syscall
パッケージの様々なプラットフォーム固有の関数、testing
パッケージの Verbose
関数、text/template/parse
パッケージの NilNode
関連の要素、unicode/utf8
の ValidRune
関数など、複数の新しいAPIが next.txt
に追加されました。
コミット
commit 0b8392d19ccb1c42f409f7690fa3fa0e0adb48e4
Author: Benny Siegert <bsiegert@gmail.com>
Date: Wed Aug 15 10:30:20 2012 +1000
api: add recent API additions to next.txt
R=golang-dev, nigeltao, minux.ma
CC=golang-dev
https://golang.org/cl/6441138
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/0b8392d19ccb1c42f409f7690fa3fa0e0adb48e4
元コミット内容
api: add recent API additions to next.txt
R=golang-dev, nigeltao, minux.ma
CC=golang-dev
https://golang.org/cl/6441138
変更の背景
Go言語の開発プロセスにおいて、APIの安定性と後方互換性は非常に重要な原則です。新しい機能や改善が標準ライブラリに追加される際、それらが既存のコードベースに影響を与えないように、また開発者が将来の変更に備えられるように、APIの変更点を明確に文書化する必要があります。api/next.txt
は、Goの次のメジャーリリース(このコミットの時点ではGo 1.1またはそれ以降)で公開される予定のAPI変更を事前にリストアップするためのファイルです。
このコミットの背景には、Go言語の進化に伴う標準ライブラリの機能拡張があります。新しい機能が実装され、それが安定版としてリリースされる前に、そのAPIが next.txt
に追加されることで、GoチームはAPIのレビューと承認プロセスを管理し、コミュニティに対して透明性を提供します。これにより、開発者は新しいAPIの導入を早期に知り、自身のアプリケーションへの影響を評価したり、新しい機能を活用する準備をしたりすることができます。
前提知識の解説
Go言語のAPI互換性ポリシー
Go言語は「Go 1 Compatibility Promise」という厳格な後方互換性ポリシーを持っています。これは、Go 1.xのリリース間で、既存のGo 1プログラムが新しいGo 1.xリリースでコンパイルされ、実行され続けることを保証するものです。このポリシーは、Go言語が広く採用される上で非常に重要な要素となっています。
APIの追加は互換性を壊すものではありませんが、APIの削除や既存APIのシグネチャ変更は互換性を壊す可能性があります。そのため、Goチームは新しいAPIの追加を慎重に行い、api/next.txt
のようなメカニズムを通じて、将来の変更を事前に公開しています。
api/next.txt
の役割
api/next.txt
は、Goの標準ライブラリに追加される予定の新しいAPI要素(関数、メソッド、型、定数など)を一覧表示するテキストファイルです。このファイルは、Goのソースコードリポジトリの api/
ディレクトリに存在します。
- 目的: 次のメジャーリリースで導入されるAPI変更を追跡し、Goチーム内でのレビューと承認プロセスを支援します。また、Goコミュニティに対して、将来のAPI変更に関する透明性を提供します。
- 内容: 各行が1つのAPI要素を表し、その要素が属するパッケージ、種類(関数、メソッド、型など)、名前、およびシグネチャが記述されます。
- プロセス: 新しいAPIが提案され、承認されると、まずこの
api/next.txt
に追加されます。そして、次のメジャーリリースが近づくと、このファイルの内容が最終的なAPIドキュメントに反映されます。
関連するGoパッケージの概要
このコミットで api/next.txt
に追加されたAPIは、以下のGo標準ライブラリパッケージに関連しています。
bytes
: バイトスライスを操作するためのユーティリティ関数と型を提供します。特にbytes.Buffer
は、可変長のバイトバッファを効率的に扱うための型です。crypto/tls
: TLS (Transport Layer Security) プロトコルを実装し、安全なネットワーク通信を提供します。crypto/x509
: X.509証明書とPKIX (Public Key Infrastructure X.509) を扱うための機能を提供します。debug/elf
: ELF (Executable and Linkable Format) ファイルを解析するための機能を提供します。ELFはUnix系システムで実行可能ファイル、共有ライブラリ、コアダンプなどに使用される標準的なファイル形式です。encoding/json
: JSON (JavaScript Object Notation) データのエンコードとデコードをサポートします。syscall
: オペレーティングシステム固有のシステムコールへの低レベルなインターフェースを提供します。プラットフォームごとに異なる実装を持つことが特徴です。testing
: Goのテストフレームワークを提供します。ユニットテスト、ベンチマークテスト、例のテストなどを記述するための機能が含まれます。text/template/parse
:text/template
パッケージの内部で使用される、テンプレートの構文解析ツリーを表現するための型と関数を提供します。unicode/utf8
: UTF-8エンコーディングされたUnicodeテキストを扱うための関数を提供します。
技術的詳細
このコミットは、Go言語のAPI進化の具体的なスナップショットを示しています。api/next.txt
に追加された各エントリは、Goの標準ライブラリが特定の機能領域でどのように拡張されているかを反映しています。
例えば、pkg bytes, method (*Buffer) Grow(int)
の追加は、bytes.Buffer
が事前に指定された容量までバッファを拡張する機能を提供することで、より効率的なメモリ管理とパフォーマンス向上を可能にすることを示唆しています。これは、特に大量のデータを扱うアプリケーションで有用です。
pkg debug/elf, method (*File) DynString(DynTag) ([]string, error)
の追加は、ELFファイルの動的セクションから文字列データを抽出する機能を提供します。これは、デバッガやプロファイラ、あるいはELFファイルを解析するツールを開発する際に非常に役立ちます。
pkg syscall
パッケージへの多数の追加は、Goが様々なオペレーティングシステム(Darwin、FreeBSD、Linux、Windows)でより低レベルなシステムコールを直接操作できるようになることを意味します。特に SlicePtrFromStrings
や UTF16FromString
, UTF16PtrFromString
のような関数は、C言語のAPIと連携する際に必要となる文字列とポインタの変換を容易にします。これは、GoでOS固有の機能や既存のCライブラリを呼び出す際の相互運用性を向上させます。
pkg testing, func Verbose() bool
の追加は、テストが冗長モードで実行されているかどうかをプログラムで確認できる機能を提供します。これにより、テストコード内で冗長出力の有無を制御し、デバッグ情報を条件付きで表示するといった柔軟なテストロギングが可能になります。
pkg text/template/parse
の NilNode
関連の追加は、テンプレートの構文解析ツリーにおける「nil」ノードの表現と操作を改善することを示しています。これは、テンプレートエンジンの内部実装の堅牢性と柔軟性を高めるための変更であり、直接的なユーザーAPIではありませんが、テンプレートの処理方法に影響を与える可能性があります。
pkg unicode/utf8, func ValidRune(rune) bool
の追加は、与えられた rune
が有効なUnicodeコードポイントであるかどうかをチェックする機能を提供します。これは、UTF-8文字列の処理において、不正な文字を検出したり、文字の妥当性を検証したりする際に役立ちます。
これらのAPI追加は、Go言語がより多様なユースケースに対応し、より強力なツールを提供するための継続的な取り組みの一部です。api/next.txt
にこれらを記録することで、GoチームはAPIの進化を体系的に管理し、Goエコシステム全体の健全性を維持しています。
コアとなるコードの変更箇所
このコミットは、api/next.txt
ファイルへの追加のみで構成されており、既存のGoソースコードのロジックを変更するものではありません。変更箇所は以下の通りです。
--- a/api/next.txt
+++ b/api/next.txt
@@ -1,4 +1,5 @@
pkg archive/tar, func FileInfoHeader(os.FileInfo, string) (*Header, error)
+pkg bytes, method (*Buffer) Grow(int)
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/x509, const ECDSA PublicKeyAlgorithm
@@ -11,6 +12,7 @@ pkg crypto/x509, const ExtKeyUsageIPSECTunnel ExtKeyUsage
pkg crypto/x509, const ExtKeyUsageIPSECUser ExtKeyUsage
pkg crypto/x509, const IncompatibleUsage InvalidReason
pkg crypto/x509, type VerifyOptions struct, KeyUsages []ExtKeyUsage
+pkg debug/elf, method (*File) DynString(DynTag) ([]string, error)
pkg debug/elf, type FileHeader struct, Entry uint64
pkg encoding/json, method (*Decoder) UseNumber()
pkg encoding/json, method (Number) Float64() (float64, error)
@@ -128,6 +130,7 @@ pkg syscall (darwin-386), const VT1 ideal-int
pkg syscall (darwin-386), const VTDLY ideal-int
pkg syscall (darwin-386), const VTIME ideal-int
pkg syscall (darwin-386), const VWERASE ideal-int
+pkg syscall (darwin-386), func SlicePtrFromStrings([]string) ([]*byte, error)
pkg syscall (darwin-386), type Termios struct
pkg syscall (darwin-386), type Termios struct, Cc [20]uint8
pkg syscall (darwin-386), type Termios struct, Cflag uint32
@@ -229,6 +232,7 @@ pkg syscall (darwin-386-cgo), const VT1 ideal-int
pkg syscall (darwin-386-cgo), const VTDLY ideal-int
pkg syscall (darwin-386-cgo), const VTIME ideal-int
pkg syscall (darwin-386-cgo), const VWERASE ideal-int
+pkg syscall (darwin-386-cgo), func SlicePtrFromStrings([]string) ([]*byte, error)
pkg syscall (darwin-386-cgo), type Termios struct
pkg syscall (darwin-386-cgo), type Termios struct, Cc [20]uint8
pkg syscall (darwin-386-cgo), type Termios struct, Cflag uint32
@@ -330,6 +334,7 @@ pkg syscall (darwin-amd64), const VT1 ideal-int
pkg syscall (darwin-amd64), const VTDLY ideal-int
pkg syscall (darwin-amd64), const VTIME ideal-int
pkg syscall (darwin-amd64), const VWERASE ideal-int
+pkg syscall (darwin-amd64), func SlicePtrFromStrings([]string) ([]*byte, error)
pkg syscall (darwin-amd64), type Termios struct
pkg syscall (darwin-amd64), type Termios struct, Cc [20]uint8
pkg syscall (darwin-amd64), type Termios struct, Cflag uint64
@@ -432,6 +437,7 @@ pkg syscall (darwin-amd64-cgo), const VT1 ideal-int
pkg syscall (darwin-amd64-cgo), const VTDLY ideal-int
pkg syscall (darwin-amd64-cgo), const VTIME ideal-int
pkg syscall (darwin-amd64-cgo), const VWERASE ideal-int
+pkg syscall (darwin-amd64-cgo), func SlicePtrFromStrings([]string) ([]*byte, error)
pkg syscall (darwin-amd64-cgo), type Termios struct
pkg syscall (darwin-amd64-cgo), type Termios struct, Cc [20]uint8
pkg syscall (darwin-amd64-cgo), type Termios struct, Cflag uint64
@@ -441,14 +447,34 @@ pkg syscall (darwin-amd64-cgo), type Termios struct, Lflag uint64
pkg syscall (darwin-amd64-cgo), type Termios struct, Oflag uint64
pkg syscall (darwin-amd64-cgo), type Termios struct, Ospeed uint64
pkg syscall (darwin-amd64-cgo), type Termios struct, Pad_cgo_0 [4]byte
+pkg syscall (freebsd-386), func SlicePtrFromStrings([]string) ([]*byte, error)
+pkg syscall (freebsd-amd64), func SlicePtrFromStrings([]string) ([]*byte, error)
pkg syscall (freebsd-amd64), func Syscall9(uintptr) (uintptr, Errno)
+pkg syscall (linux-386), func SlicePtrFromStrings([]string) ([]*byte, error)
+pkg syscall (linux-386-cgo), func SlicePtrFromStrings([]string) ([]*byte, error)
+pkg syscall (linux-amd64), func SlicePtrFromStrings([]*byte, error)
+pkg syscall (linux-amd64-cgo), func SlicePtrFromStrings([]string) ([]*byte, error)
+pkg syscall (linux-arm), func SlicePtrFromStrings([]string) ([]*byte, error)
pkg syscall (windows-386), const CREATE_NEW_PROCESS_GROUP ideal-int
pkg syscall (windows-386), const CTRL_BREAK_EVENT ideal-int
pkg syscall (windows-386), const CTRL_C_EVENT ideal-int
pkg syscall (windows-386), func Getsockopt(Handle, int32, int32, *byte, *int32) error
+pkg syscall (windows-386), func UTF16FromString(string) ([]uint16, error)
+pkg syscall (windows-386), func UTF16PtrFromString(string) (*uint16, error)
pkg syscall (windows-386), type SysProcAttr struct, CreationFlags uint32
pkg syscall (windows-amd64), const CREATE_NEW_PROCESS_GROUP ideal-int
pkg syscall (windows-amd64), const CTRL_BREAK_EVENT ideal-int
pkg syscall (windows-amd64), const CTRL_C_EVENT ideal-int
pkg syscall (windows-amd64), func Getsockopt(Handle, int32, int32, *byte, *int32) error
+pkg syscall (windows-amd64), func UTF16FromString(string) ([]uint16, error)
+pkg syscall (windows-amd64), func UTF16PtrFromString(string) (*uint16, error)
pkg syscall (windows-amd64), type SysProcAttr struct, CreationFlags uint32
+pkg syscall, func BytePtrFromString(string) (*byte, error)
+pkg syscall, func ByteSliceFromString(string) ([]byte, error)
+pkg testing, func Verbose() bool
+pkg text/template/parse, const NodeNil NodeType
+pkg text/template/parse, method (*NilNode) Copy() Node
+pkg text/template/parse, method (*NilNode) String() string
+pkg text/template/parse, method (*NilNode) Type() NodeType
+pkg text/template/parse, type NilNode bool
+pkg unicode/utf8, func ValidRune(rune) bool
コアとなるコードの解説
このコミットは、Go言語のAPI定義ファイルである api/next.txt
に、以下の新しいAPI要素を追加しています。これらの追加は、Goの標準ライブラリが進化し、より多くの機能とプラットフォームサポートを提供するようになったことを示しています。
-
pkg bytes, method (*Buffer) Grow(int)
:bytes.Buffer
型にGrow
メソッドが追加されました。このメソッドは、バッファの容量を引数で指定されたサイズまで拡張します。これにより、事前に必要な容量を確保することで、頻繁な再割り当てによるパフォーマンスオーバーヘッドを削減できます。
-
pkg debug/elf, method (*File) DynString(DynTag) ([]string, error)
:debug/elf.File
型にDynString
メソッドが追加されました。このメソッドは、ELFファイルの動的セクションから指定されたタグ(DynTag
)に対応する文字列のリストを抽出します。ELFファイルの解析ツール開発において、動的リンク情報などを取得する際に有用です。
-
pkg syscall
(複数プラットフォーム):syscall
パッケージには、Darwin (386, amd64, cgo版)、FreeBSD (386, amd64)、Linux (386, amd64, arm, cgo版)、Windows (386, amd64) 向けに、以下の関数が追加されました。func SlicePtrFromStrings([]string) ([]*byte, error)
: 文字列のスライスをバイトポインタのスライスに変換します。これは、C言語のAPIがchar**
のような形式で文字列配列を期待する場合に、Goの文字列スライスを渡すために使用されます。func UTF16FromString(string) ([]uint16, error)
: Goの文字列をUTF-16エンコードされたuint16
のスライスに変換します。Windows APIは通常UTF-16文字列を扱うため、Windowsプラットフォームでの相互運用性に不可欠です。func UTF16PtrFromString(string) (*uint16, error)
: Goの文字列をUTF-16エンコードされたuint16
のポインタに変換します。これは、Windows APIがLPCWSTR
(long pointer to constant wide string) のような形式で文字列ポインタを期待する場合に利用されます。func BytePtrFromString(string) (*byte, error)
: Goの文字列をバイトポインタに変換します。これは、C言語のAPIがchar*
のような形式で文字列を期待する場合に、Goの文字列を渡すために使用されます。func ByteSliceFromString(string) ([]byte, error)
: Goの文字列をバイトスライスに変換します。
-
pkg testing, func Verbose() bool
:testing
パッケージにVerbose
関数が追加されました。この関数は、テストが-v
フラグ(冗長モード)付きで実行されている場合にtrue
を返します。これにより、テストコード内で冗長なログ出力やデバッグ情報を条件付きで表示するロジックを実装できます。
-
pkg text/template/parse
:text/template/parse
パッケージにNilNode
型とその関連メソッドが追加されました。const NodeNil NodeType
:NilNode
を表すノードタイプ定数。method (*NilNode) Copy() Node
:NilNode
のコピーを返します。method (*NilNode) String() string
:NilNode
の文字列表現を返します。method (*NilNode) Type() NodeType
:NilNode
のノードタイプを返します。type NilNode bool
: テンプレートの構文解析ツリーにおける「nil」ノードを表す型。これは、テンプレートの内部処理において、特定のノードが存在しない状態を表現するために使用されます。
-
pkg unicode/utf8, func ValidRune(rune) bool
:unicode/utf8
パッケージにValidRune
関数が追加されました。この関数は、与えられたrune
(Unicodeコードポイント) が有効なUnicodeコードポイントである場合にtrue
を返します。これにより、UTF-8文字列処理における文字の妥当性検証が容易になります。
これらのAPI追加は、Go言語がより堅牢で、パフォーマンスが高く、多様なプラットフォームやユースケースに対応できるようになるための重要なステップです。
関連リンク
- Go言語公式ドキュメント: https://golang.org/doc/
- Go 1 Compatibility Promise: https://golang.org/doc/go1compat
- Goのソースコードリポジトリ: https://github.com/golang/go
- Go Code Review Comments (API Design): https://golang.org/doc/effective_go.html#api-design
参考にした情報源リンク
- Go言語の公式ドキュメントおよびソースコード
- Goのコミット履歴と関連するコードレビュー (Gerrit CL 6441138)
api/next.txt
ファイルの一般的な役割に関するGoコミュニティの議論- 各パッケージのGoDocドキュメント (例:
bytes.Buffer
,debug/elf
,syscall
,testing
,unicode/utf8
)