[インデックス 17684] ファイルの概要
このコミットは、Go言語の次期API変更を記録する api/next.txt
ファイルを更新するものです。具体的には、encoding/xml
、go/build
、go/token
、net
、runtime
、syscall
、text/template
パッケージにおける新しいメソッド、フィールド、定数の追加がリストされています。これらの変更は、Go言語の標準ライブラリの機能拡張と改善を示しています。
コミット
commit 547e4f9b2e1e58285ea50db9fc099ab5b4d2f0b2
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date: Mon Sep 23 13:56:21 2013 -0700
api: update next.txt
R=golang-dev, minux.ma
CC=golang-dev
https://golang.org/cl/13820046
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/547e4f9b2e1e58285ea50db9fc099ab5b4d2f0b2
元コミット内容
このコミットは、api/next.txt
ファイルに以下の変更を加えています。
--- a/api/next.txt
+++ b/api/next.txt
@@ -70,6 +70,7 @@ pkg encoding, type TextUnmarshaler interface { UnmarshalText }\
pkg encoding, type TextUnmarshaler interface, UnmarshalText([]uint8) error
pkg encoding/xml, method (*Encoder) EncodeElement(interface{}, StartElement) error
pkg encoding/xml, method (*Encoder) EncodeToken(Token) error
+pkg encoding/xml, method (*Encoder) Flush() error
pkg encoding/xml, method (StartElement) End() EndElement
pkg encoding/xml, type Marshaler interface { MarshalXML }\
pkg encoding/xml, type Marshaler interface, MarshalXML(*Encoder, StartElement) error
@@ -87,10 +88,13 @@ pkg flag, var CommandLine *FlagSet
pkg go/ast, type SliceExpr struct, Max Expr
pkg go/ast, type TypeAssertExpr struct, Lparen token.Pos
pkg go/ast, type TypeAssertExpr struct, Rparen token.Pos
+pkg go/build, method (*Context) MatchFile(string, string) (bool, error)
pkg go/build, type Package struct, AllTags []string
pkg go/build, type Package struct, CXXFiles []string
pkg go/build, type Package struct, CgoCPPFLAGS []string
pkg go/build, type Package struct, CgoCXXFLAGS []string
+pkg go/build, type Package struct, ConflictDir string
+pkg go/token, method (*File) MergeLine(int)
pkg html/template, type Template struct, Tree *parse.Tree
pkg image/color/palette, var Plan9 []color.Color
pkg image/color/palette, var WebSafe []color.Color
@@ -754,11 +758,14 @@ pkg log/syslog (openbsd-amd64-cgo), type Writer struct
pkg net, method (*IP) UnmarshalText([]uint8) error
pkg net, method (*TCPConn) SetKeepAlivePeriod(time.Duration) error
pkg net, method (IP) MarshalText() ([]uint8, error)
+pkg net, type Dialer struct, DualStack bool
pkg net/smtp, method (*Client) Close() error
pkg os (linux-arm), const O_SYNC = 1052672
pkg os (linux-arm-cgo), const O_SYNC = 1052672
pkg reflect, method (Value) SetCap(int)
pkg reflect, method (Value) Slice3(int, int, int) Value
+pkg runtime, type MemStats struct, GCSys uint64
+pkg runtime, type MemStats struct, OtherSys uint64
pkg runtime/debug, func SetMaxStack(int) int
pkg runtime/debug, func SetMaxThreads(int) int
pkg sort, func Stable(Interface)
@@ -9798,6 +9805,12 @@ pkg syscall (linux-386), const SizeofICMPv6Filter = 32
pkg syscall (linux-386), const SizeofICMPv6Filter ideal-int
pkg syscall (linux-386), const SizeofIPv6MTUInfo = 32
pkg syscall (linux-386), const SizeofIPv6MTUInfo ideal-int
+pkg syscall (linux-386), const TCIFLUSH = 0
+pkg syscall (linux-386), const TCIFLUSH ideal-int
+pkg syscall (linux-386), const TCIOFLUSH = 2
+pkg syscall (linux-386), const TCIOFLUSH ideal-int
+pkg syscall (linux-386), const TCOFLUSH = 1
+pkg syscall (linux-386), const TCOFLUSH ideal-int
pkg syscall (linux-386), func Dup3(int, int, int) error
pkg syscall (linux-386), func Getpriority(int, int) (int, error)
pkg syscall (linux-386), func GetsockoptICMPv6Filter(int, int, int) (*ICMPv6Filter, error)
@@ -9867,6 +9880,12 @@ pkg syscall (linux-386-cgo), const SizeofICMPv6Filter = 32
pkg syscall (linux-386-cgo), const SizeofICMPv6Filter ideal-int
pkg syscall (linux-386-cgo), const SizeofIPv6MTUInfo = 32
pkg syscall (linux-386-cgo), const SizeofIPv6MTUInfo ideal-int
+pkg syscall (linux-386-cgo), const TCIFLUSH = 0
+pkg syscall (linux-386-cgo), const TCIFLUSH ideal-int
+pkg syscall (linux-386-cgo), const TCIOFLUSH = 2
+pkg syscall (linux-386-cgo), const TCIOFLUSH ideal-int
+pkg syscall (linux-386-cgo), const TCOFLUSH = 1
+pkg syscall (linux-386-cgo), const TCOFLUSH ideal-int
pkg syscall (linux-386-cgo), func Dup3(int, int, int) error
pkg syscall (linux-386-cgo), func Getpriority(int, int) (int, error)
pkg syscall (linux-386-cgo), func GetsockoptICMPv6Filter(int, int, int) (*ICMPv6Filter, error)
@@ -9936,6 +9955,12 @@ pkg syscall (linux-amd64), const SizeofICMPv6Filter = 32
pkg syscall (linux-amd64), const SizeofICMPv6Filter ideal-int
pkg syscall (linux-amd64), const SizeofIPv6MTUInfo = 32
pkg syscall (linux-amd64), const SizeofIPv6MTUInfo ideal-int
+pkg syscall (linux-amd64), const TCIFLUSH = 0
+pkg syscall (linux-amd64), const TCIFLUSH ideal-int
+pkg syscall (linux-amd64), const TCIOFLUSH = 2
+pkg syscall (linux-amd64), const TCIOFLUSH ideal-int
+pkg syscall (linux-amd64), const TCOFLUSH = 1
+pkg syscall (linux-amd64), const TCOFLUSH ideal-int
pkg syscall (linux-amd64), func Dup3(int, int, int) error
pkg syscall (linux-amd64), func Getpriority(int, int) (int, error)
pkg syscall (linux-amd64), func GetsockoptICMPv6Filter(int, int, int) (*ICMPv6Filter, error)
@@ -10005,6 +10030,12 @@ pkg syscall (linux-amd64-cgo), const SizeofICMPv6Filter = 32
pkg syscall (linux-amd64-cgo), const SizeofICMPv6Filter ideal-int
pkg syscall (linux-amd64-cgo), const SizeofIPv6MTUInfo = 32
pkg syscall (linux-amd64-cgo), const SizeofIPv6MTUInfo ideal-int
+pkg syscall (linux-amd64-cgo), const TCIFLUSH = 0
+pkg syscall (linux-amd64-cgo), const TCIFLUSH ideal-int
+pkg syscall (linux-amd64-cgo), const TCIOFLUSH = 2
+pkg syscall (linux-amd64-cgo), const TCIOFLUSH ideal-int
+pkg syscall (linux-amd64-cgo), const TCOFLUSH = 1
+pkg syscall (linux-amd64-cgo), const TCOFLUSH ideal-int
pkg syscall (linux-amd64-cgo), func Dup3(int, int, int) error
pkg syscall (linux-amd64-cgo), func Getpriority(int, int) (int, error)
pkg syscall (linux-amd64-cgo), func GetsockoptICMPv6Filter(int, int, int) (*ICMPv6Filter, error)
@@ -10074,6 +10105,12 @@ pkg syscall (linux-arm), const SizeofICMPv6Filter = 32
pkg syscall (linux-arm), const SizeofICMPv6Filter ideal-int
pkg syscall (linux-arm), const SizeofIPv6MTUInfo = 32
pkg syscall (linux-arm), const SizeofIPv6MTUInfo ideal-int
+pkg syscall (linux-arm), const TCIFLUSH = 0
+pkg syscall (linux-arm), const TCIFLUSH ideal-int
+pkg syscall (linux-arm), const TCIOFLUSH = 2
+pkg syscall (linux-arm), const TCIOFLUSH ideal-int
+pkg syscall (linux-arm), const TCOFLUSH = 1
+pkg syscall (linux-arm), const TCOFLUSH ideal-int
pkg syscall (linux-arm), func Dup3(int, int, int) error
pkg syscall (linux-arm), func Getpriority(int, int) (int, error)
pkg syscall (linux-arm), func GetsockoptICMPv6Filter(int, int, int) (*ICMPv6Filter, error)
@@ -11751,6 +11788,12 @@ pkg syscall (linux-arm-cgo), const SizeofSockaddrUnix ideal-int
pkg syscall (linux-arm-cgo), const SizeofTCPInfo ideal-int
pkg syscall (linux-arm-cgo), const SizeofUcred ideal-int
pkg syscall (linux-arm-cgo), const TCGETS ideal-int
+pkg syscall (linux-arm-cgo), const TCIFLUSH = 0
+pkg syscall (linux-arm-cgo), const TCIFLUSH ideal-int
+pkg syscall (linux-arm-cgo), const TCIOFLUSH = 2
+pkg syscall (linux-arm-cgo), const TCIOFLUSH ideal-int
+pkg syscall (linux-arm-cgo), const TCOFLUSH = 1
+pkg syscall (linux-arm-cgo), const TCOFLUSH ideal-int
pkg syscall (linux-arm-cgo), const TCP_CONGESTION ideal-int
pkg syscall (linux-arm-cgo), const TCP_CORK ideal-int
pkg syscall (linux-arm-cgo), const TCP_DEFER_ACCEPT ideal-int
@@ -32427,6 +32470,8 @@ pkg testing, type TB interface, SkipNow()\
pkg testing, type TB interface, Skipf(string, ...interface{})\
pkg testing, type TB interface, Skipped() bool\
pkg testing, type TB interface, unexported methods\
+pkg text/template, method (Template) Copy() *parse.Tree\
+pkg text/template/parse, method (*Tree) Copy() *Tree\
pkg time, method (*Time) UnmarshalBinary([]uint8) error
pkg time, method (*Time) UnmarshalText([]uint8) error
pkg time, method (Time) MarshalBinary() ([]uint8, error)\
変更の背景
このコミットは、Go言語の標準ライブラリに将来的に導入される予定のAPI変更を api/next.txt
ファイルに記録するためのものです。api/next.txt
は、GoのAPI互換性ポリシーを維持するために重要な役割を果たします。Goは後方互換性を非常に重視しており、新しいAPIの追加や既存APIの変更は厳格なプロセスを経て行われます。このファイルは、開発中のAPI変更を追跡し、リリース前にレビューするためのメカニズムの一部です。
具体的には、このコミットで追加されたAPIは、XMLエンコーディングのより詳細な制御、Goのビルドシステムにおけるファイルマッチングとパッケージの競合解決の改善、トークン処理の柔軟性向上、ネットワークダイヤラのデュアルスタック対応、Goランタイムのメモリ統計の拡充、そして低レベルなターミナルI/O制御機能の提供など、多岐にわたる機能強化と情報公開を目的としています。
前提知識の解説
このコミットの変更内容を理解するためには、以下のGo言語の概念とパッケージに関する知識が役立ちます。
- GoのAPI互換性: Go言語は、バージョン間の後方互換性を非常に重視しています。これは、既存のコードが新しいGoバージョンでも問題なく動作することを保証するためです。
api/next.txt
のようなファイルは、この互換性ポリシーを維持するためのツールの一つであり、将来のAPI変更を事前に記録し、レビューする場を提供します。 encoding/xml
パッケージ: XMLデータのエンコードとデコードを行うためのパッケージです。XMLは、構造化されたデータを表現するためのマークアップ言語であり、Webサービスや設定ファイルなどで広く利用されます。go/build
パッケージ: Goのビルドプロセスに関する情報を提供するパッケージです。Goのソースコードがどのようにビルドされ、どのファイルがビルドに含まれるかなどを決定するロジックが含まれています。go/token
パッケージ: Goのソースコードを字句解析する際に使用されるトークン(キーワード、識別子、演算子など)を定義し、ソースコード内の位置情報(ファイル、行、列)を管理するためのパッケージです。net
パッケージ: ネットワークI/O機能を提供するパッケージです。TCP/IP、UDP、Unixドメインソケットなどのネットワークプロトコルを扱うための機能が含まれています。runtime
パッケージ: Goランタイムシステムとのインタラクションを可能にするパッケージです。ガベージコレクション、ゴルーチン管理、メモリ統計などの低レベルな機能へのアクセスを提供します。syscall
パッケージ: オペレーティングシステムのシステムコールへの低レベルなインターフェースを提供するパッケージです。OS固有の機能に直接アクセスするために使用されますが、通常はより高レベルなGoの標準ライブラリ(os
、net
など)を使用することが推奨されます。text/template
パッケージ: テキストベースのテンプレートを生成するためのパッケージです。Goのテンプレートエンジンは、データ構造をテンプレートに適用して、動的にテキストコンテンツを生成するのに使用されます。
技術的詳細
このコミットで api/next.txt
に追加された各APIについて、技術的な詳細を解説します。
encoding/xml
パッケージ
method (*Encoder) Flush() error
:encoding/xml.Encoder
は、XMLデータをストリームに書き込むための構造体です。通常、Encode()
やEncodeElement()
メソッドを使用すると、内部バッファリングされたデータは自動的にフラッシュ(書き出し)されます。しかし、EncodeToken()
メソッドを使用して個々のXMLトークン(開始タグ、終了タグ、文字データなど)を細かく書き込む場合、このFlush()
メソッドを明示的に呼び出すことで、バッファに溜まったXMLデータを基になるio.Writer
に強制的に書き出すことができます。これは、XMLストリームをリアルタイムで処理する必要がある場合や、部分的なXMLドキュメントを生成する際に重要になります。
go/build
パッケージ
method (*Context) MatchFile(string, string) (bool, error)
:go/build.Context
は、Goのビルド環境(GOOS
,GOARCH
,GOPATH
など)を表す構造体です。MatchFile
メソッドは、指定されたファイル(ディレクトリとファイル名)が現在のビルドコンテキストに基づいてGoパッケージに含まれるべきかどうかを判断します。これは、ビルドタグ(//go:build
コメントやファイル名による制約)や環境変数など、Goのビルド制約を考慮して行われます。この機能は、Goのツールチェインが特定のプラットフォームやビルド条件に合わせたソースファイルを正確に選択するために利用されます。type Package struct, ConflictDir string
:go/build.Package
は、Goパッケージに関する情報(ソースファイル、依存関係など)を保持する構造体です。ConflictDir
フィールドは、$GOPATH
内でパッケージのディレクトリが他のディレクトリによって「シャドウイング」されている場合に、その競合するディレクトリのパスを示します。これは、複数の場所から同じパッケージが提供される可能性がある場合に、Goのビルドシステムがエラーを報告し、ユーザーに問題の解決を促すために使用されます。例えば、go install
コマンドは、一意のインストール場所を特定できない場合にこの情報を用いてエラーメッセージを生成します。
go/token
パッケージ
method (*File) MergeLine(int)
:go/token.File
は、Goソースファイルの行と列のオフセット情報を管理する構造体です。MergeLine
メソッドは、指定された行とその次の行を結合する機能を提供します。これは、指定された行の末尾にある改行文字をスペースに置き換えることで実現され、その後のコンテンツのバイトオフセットの一貫性を維持するのに役立ちます。この機能は、Goの字句解析器やパーサーがソースコードを処理する際に、特定の構文構造(例えば、複数行にまたがる文字列リテラルやコメント)を適切に扱うために内部的に使用される可能性があります。
net
パッケージ
type Dialer struct, DualStack bool
:net.Dialer
は、ネットワーク接続を確立するための設定をカスタマイズする構造体です。DualStack
フィールドは、このコミットの時点ではbool
型としてリストされていますが、Go 1.12以降ではFallbackDelay
フィールドによってデュアルスタック(IPv4とIPv6の両方)の挙動が制御される「Happy Eyeballs」アルゴリズムがデフォルトで実装されています。FallbackDelay
が非負の期間に設定されている場合、ダイヤラはIPv4とIPv6の両方のアドレスに同時に、またはわずかな遅延を伴って接続を試みます。api/next.txt
にDualStack bool
が記載されているのは、初期の設計段階でのAPI案、あるいは特定の内部的なユースケースを指している可能性があります。最終的にはFallbackDelay
がより柔軟な制御を提供する方法として採用されました。
runtime
パッケージ
type MemStats struct, GCSys uint64
:runtime.MemStats
は、Goランタイムのメモリ使用状況に関する統計情報を提供する構造体です。GCSys
フィールドは、ガベージコレクション(GC)のメタデータのためにGoランタイムが使用するメモリのバイト数を示します。これには、GCがオブジェクトの追跡やマーク&スイーププロセスを実行するために内部的に割り当てるデータ構造のメモリが含まれます。type MemStats struct, OtherSys uint64
:OtherSys
フィールドは、Goランタイムがヒープ以外の部分で割り当てる、その他のシステムメモリのバイト数を示します。これには、mspan
やmcache
といったGoのメモリ管理システムの中核をなす構造体など、ランタイムの内部コンポーネントが使用するメモリが含まれます。GCSys
とOtherSys
は、Goアプリケーションの全体的なメモリフットプリントを理解し、ランタイムのメモリオーバーヘッドをデバッグする上で重要な情報を提供します。
syscall
パッケージ
const TCIFLUSH = 0
,const TCIOFLUSH = 2
,const TCOFLUSH = 1
(およびideal-int
): これらの定数は、syscall
パッケージ内で定義されており、主にターミナルI/O操作を制御するために使用されます。これらは通常、tcflush
システムコールに引数として渡され、ターミナルバッファ内のデータを破棄するために利用されます。TCIFLUSH
: ターミナルが受信したが、アプリケーションによってまだ読み取られていない入力データを破棄します。TCOFLUSH
: アプリケーションが書き込んだが、ターミナルによってまだ送信されていない出力データを破棄します。TCIOFLUSH
:TCIFLUSH
とTCOFLUSH
の両方の機能を組み合わせたもので、未読の入力データと未送信の出力データの両方を破棄します。 これらの定数は、Linuxの様々なアーキテクチャ(386, amd64, arm, およびそれらのcgoバージョン)で利用可能であることが示されています。syscall
パッケージは低レベルなインターフェースを提供するため、通常はよりポータブルで高レベルなos
やnet
パッケージ、またはgolang.org/x/sys
パッケージの使用が推奨されます。
text/template
パッケージ
method (Template) Copy() *parse.Tree
:text/template.Template
は、テンプレートの実行を管理する構造体です。このCopy()
メソッドは、テンプレートの内部表現である抽象構文木(AST)のルートノードである*parse.Tree
を返すことを示唆しています。通常、Template.Clone()
メソッドはテンプレートのシャローコピーを作成し、基になるparse.Tree
は共有されます。しかし、このCopy()
メソッドが*parse.Tree
を返すということは、テンプレートのASTを直接操作したり、そのディープコピーを取得したりするユースケースを想定している可能性があります。method (*Tree) Copy() *Tree
:text/template/parse.Tree
は、テンプレートのASTを表す構造体です。このCopy()
メソッドは、parse.Tree
のディープコピーを作成します。これにより、元のASTに影響を与えることなく、テンプレートの構造を独立して変更することが可能になります。ただし、parse
パッケージはGoのテンプレートエンジンの内部実装であり、通常は直接操作することは推奨されません。これらのCopy
メソッドは、テンプレートの内部構造を分析したり、高度なテンプレート変換を行ったりする際に利用される可能性があります。
コアとなるコードの変更箇所
このコミット自体は、Goのソースコードに直接的な機能変更を加えるものではなく、api/next.txt
というテキストファイルの内容を更新しています。したがって、特定の「コアとなるコードの変更箇所」は存在しません。変更は、将来のGoリリースで導入されるAPIのリストに新しいエントリを追加することに限定されます。
コアとなるコードの解説
前述の通り、このコミットはコードの変更ではなく、APIの変更予定を記述したテキストファイルの更新です。したがって、解説すべき「コアとなるコード」は存在しません。api/next.txt
は、GoのAPIレビュープロセスの一部として、提案されたAPI変更を文書化し、コミュニティや開発者からのフィードバックを収集するために使用されます。
関連リンク
- Go言語の公式ドキュメント: https://go.dev/
- GoのAPI互換性ポリシー: Goの公式ドキュメントやブログで「Go 1 compatibility」などのキーワードで検索すると詳細が見つかります。
参考にした情報源リンク
- Go言語の
encoding/xml
パッケージドキュメント: https://pkg.go.dev/encoding/xml - Go言語の
go/build
パッケージドキュメント: https://pkg.go.dev/go/build - Go言語の
go/token
パッケージドキュメント: https://pkg.go.dev/go/token - Go言語の
net
パッケージドキュメント: https://pkg.go.dev/net - Go言語の
runtime
パッケージドキュメント: https://pkg.go.dev/runtime - Go言語の
syscall
パッケージドキュメント: https://pkg.go.dev/syscall - Go言語の
text/template
パッケージドキュメント: https://pkg.go.dev/text/template - Go言語の
text/template/parse
パッケージドキュメント: https://pkg.go.dev/text/template/parse - Goの
net.Dialer
と Happy Eyeballs に関する情報 (Go 1.12以降): 関連するGoのリリースノートやブログ記事。 tcflush
システムコールに関するLinux manページや関連ドキュメント。