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

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

このコミットは、Go言語の次期API変更を記録する api/next.txt ファイルを更新するものです。具体的には、encoding/xmlgo/buildgo/tokennetruntimesyscalltext/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の標準ライブラリ(osnetなど)を使用することが推奨されます。
  • 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.txtDualStack bool が記載されているのは、初期の設計段階でのAPI案、あるいは特定の内部的なユースケースを指している可能性があります。最終的には FallbackDelay がより柔軟な制御を提供する方法として採用されました。

runtime パッケージ

  • type MemStats struct, GCSys uint64: runtime.MemStats は、Goランタイムのメモリ使用状況に関する統計情報を提供する構造体です。GCSys フィールドは、ガベージコレクション(GC)のメタデータのためにGoランタイムが使用するメモリのバイト数を示します。これには、GCがオブジェクトの追跡やマーク&スイーププロセスを実行するために内部的に割り当てるデータ構造のメモリが含まれます。
  • type MemStats struct, OtherSys uint64: OtherSys フィールドは、Goランタイムがヒープ以外の部分で割り当てる、その他のシステムメモリのバイト数を示します。これには、mspanmcache といったGoのメモリ管理システムの中核をなす構造体など、ランタイムの内部コンポーネントが使用するメモリが含まれます。GCSysOtherSys は、Goアプリケーションの全体的なメモリフットプリントを理解し、ランタイムのメモリオーバーヘッドをデバッグする上で重要な情報を提供します。

syscall パッケージ

  • const TCIFLUSH = 0, const TCIOFLUSH = 2, const TCOFLUSH = 1 (および ideal-int): これらの定数は、syscall パッケージ内で定義されており、主にターミナルI/O操作を制御するために使用されます。これらは通常、tcflush システムコールに引数として渡され、ターミナルバッファ内のデータを破棄するために利用されます。
    • TCIFLUSH: ターミナルが受信したが、アプリケーションによってまだ読み取られていない入力データを破棄します。
    • TCOFLUSH: アプリケーションが書き込んだが、ターミナルによってまだ送信されていない出力データを破棄します。
    • TCIOFLUSH: TCIFLUSHTCOFLUSH の両方の機能を組み合わせたもので、未読の入力データと未送信の出力データの両方を破棄します。 これらの定数は、Linuxの様々なアーキテクチャ(386, amd64, arm, およびそれらのcgoバージョン)で利用可能であることが示されています。syscall パッケージは低レベルなインターフェースを提供するため、通常はよりポータブルで高レベルな osnet パッケージ、または 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」などのキーワードで検索すると詳細が見つかります。

参考にした情報源リンク