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

[インデックス 13627] ファイルの概要

このコミットは、Go言語の標準ライブラリのAPI変更を追跡するためのファイルである api/next.txt に、最近追加されたAPI要素を記録するものです。Go言語では、後方互換性を非常に重視しており、APIの変更は厳格に管理されています。api/next.txt は、次のメジャーリリースで導入される予定のAPI変更を一覧化し、開発者が将来の変更を把握できるようにするための重要なドキュメントです。このコミットにより、bytes.BufferGrow メソッド、debug/elfDynString メソッド、syscall パッケージの様々なプラットフォーム固有の関数、testing パッケージの Verbose 関数、text/template/parse パッケージの NilNode 関連の要素、unicode/utf8ValidRune 関数など、複数の新しい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)でより低レベルなシステムコールを直接操作できるようになることを意味します。特に SlicePtrFromStringsUTF16FromString, UTF16PtrFromString のような関数は、C言語のAPIと連携する際に必要となる文字列とポインタの変換を容易にします。これは、GoでOS固有の機能や既存のCライブラリを呼び出す際の相互運用性を向上させます。

pkg testing, func Verbose() bool の追加は、テストが冗長モードで実行されているかどうかをプログラムで確認できる機能を提供します。これにより、テストコード内で冗長出力の有無を制御し、デバッグ情報を条件付きで表示するといった柔軟なテストロギングが可能になります。

pkg text/template/parseNilNode 関連の追加は、テンプレートの構文解析ツリーにおける「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言語の公式ドキュメントおよびソースコード
  • Goのコミット履歴と関連するコードレビュー (Gerrit CL 6441138)
  • api/next.txt ファイルの一般的な役割に関するGoコミュニティの議論
  • 各パッケージのGoDocドキュメント (例: bytes.Buffer, debug/elf, syscall, testing, unicode/utf8)