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

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

このコミットは、Go言語の次期リリース(Go 1.1)に向けたAPIの変更を記録する api/next.txt ファイルの更新です。このファイルは、Goの標準ライブラリに追加される新しい関数、型、定数などを追跡するために使用されます。このコミットでは、crypto/x509encoding/csvgo/formatlog/syslogmath/bignetnet/httpreflectsyscalltimeなど、多数のパッケージにわたる広範なAPIの追加と変更が含まれています。

コミット

commit a58668ca0e3d8ed2195a529eb5008053d12cd3a5
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Mon Dec 17 23:01:36 2012 +0800

    api/next.txt: update
    
    R=golang-dev, rsc, bradfitz
    CC=golang-dev
    https://golang.org/cl/6935061

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/a58668ca0e3d8ed2195a529eb5008053d12cd3a5

元コミット内容

api/next.txt: update

このコミットは、Goの次期リリースで導入される予定の新しいAPI要素を api/next.txt ファイルに追加するものです。このファイルは、GoのAPI互換性ポリシーの一環として、将来のリリースで公開されるAPIのリストを維持するために使用されます。

変更の背景

このコミットの背景には、Go言語の標準ライブラリの機能拡張と改善があります。Go 1のリリース後、開発者からのフィードバックや新たな要件に基づいて、既存パッケージの機能強化や新しいユースケースに対応するためのAPIが追加されました。api/next.txtの更新は、これらの変更がGo 1の互換性保証に違反しないことを確認しつつ、次期リリースで利用可能になるAPIを公式に記録するプロセスの一部です。特に、暗号化、ネットワーク、システムコール、リフレクション、時間操作など、多岐にわたる分野での機能向上が図られています。

前提知識の解説

このコミットの変更内容を理解するためには、以下のGo言語の概念と関連技術についての基本的な知識が必要です。

  • Go言語のAPI互換性: Go 1以降、Go言語はAPIの安定性を重視しており、既存の公開APIは後方互換性が維持されることが保証されています。api/next.txtのようなファイルは、この互換性ポリシーを管理し、新しいAPIが追加される際にその変更を追跡するために用いられます。このファイルは、Goのリリースサイクルにおいて、次期バージョンで追加される予定の公開APIを事前にリストアップし、コミュニティによるレビューや議論を可能にする役割も果たします。
  • Goの標準ライブラリ: Goは豊富な標準ライブラリを提供しており、暗号化、ネットワーク、ファイルシステム操作、データ構造など、様々な機能が含まれています。このコミットは、これらの標準ライブラリの特定のパッケージに新しい機能を追加するものです。Goの標準ライブラリは、Goプログラムの堅牢性と効率性を高めるための基盤を提供します。
  • PEMエンコーディング: crypto/x509パッケージに関連して、PEM (Privacy-Enhanced Mail) は、X.509証明書や秘密鍵などの暗号化データをASCII形式で表現するための一般的なエンコーディング形式です。通常、-----BEGIN ...----------END ...----- のヘッダとフッタで囲まれたBase64エンコードされたデータで構成されます。これにより、バイナリデータをテキストベースのプロトコル(メールなど)で安全に転送できます。
  • Syslog: log/syslogパッケージに関連して、Syslogはシステムメッセージのロギングのための標準プロトコルです。UNIX系システムで広く利用されており、メッセージの重要度を示す「プライオリティ」(例: LOG_ERR, LOG_INFO)と、メッセージを生成したプログラムの種類を示す「ファシリティ」(例: LOG_AUTH, LOG_MAIL)を組み合わせてログを分類します。
  • リフレクション: reflectパッケージに関連して、リフレクションはプログラムの実行中に型情報や構造を検査・操作する機能です。これにより、コンパイル時には型が不明な場合でも、動的にオブジェクトのメソッドを呼び出したり、フィールドにアクセスしたり、新しい型のインスタンスを作成したりすることが可能になります。Goのリフレクションは、特に汎用的なデータシリアライゼーションライブラリや、テストフレームワーク、RPCシステムなどで活用されます。
  • TCPInfo構造体: syscallパッケージに関連して、Linuxカーネルが提供するTCPソケットの統計情報を含む構造体です。この構造体は、TCP接続の現在の状態(例: 輻輳ウィンドウサイズ、往復時間、再送回数など)に関する詳細な情報を提供し、ネットワーク接続のデバッグ、監視、および最適化に利用されます。getsockoptシステムコールを通じて取得されます。
  • GoのビルドタグとOS/アーキテクチャ固有のコード: log/syslogの変更に見られるように、Goではビルドタグ(例: darwin-386linux-amd64)を使用して、特定のOSやCPUアーキテクチャに固有のコードをコンパイル時に含めることができます。これにより、プラットフォーム固有の機能や定数を適切に公開し、クロスプラットフォーム対応とプラットフォーム固有の最適化を両立させることが可能になります。

技術的詳細

このコミットで追加されたAPIは多岐にわたりますが、主要な変更点をいくつかピックアップして技術的な詳細を解説します。

crypto/x509 パッケージの拡張

  • PEM暗号化/復号化のサポート: EncryptPEMBlockDecryptPEMBlock 関数および PEMCipher 型、PEMCipherAES128 などの定数が追加されました。これにより、Goの標準ライブラリでPEM形式のブロックを暗号化・復号化する機能が提供されます。これは、秘密鍵などの機密情報をPEM形式で安全に保存・転送する際に非常に重要です。以前は、PEMブロックの暗号化には外部ライブラリや手動での実装が必要な場合がありましたが、これらのAPIの追加により、より簡単に安全なPEM操作が可能になります。特に、PEMCipher 定数は、DES、3DES、AES128、AES192、AES256といった様々な暗号化アルゴリズムをサポートすることを示しており、幅広いセキュリティ要件に対応できます。
  • EC秘密鍵のパース: ParseECPrivateKey 関数が追加され、楕円曲線暗号(ECC)の秘密鍵をバイトスライスからパースできるようになりました。ECCはRSAに代わる次世代の公開鍵暗号方式として注目されており、より短い鍵長で同等のセキュリティ強度を提供できるため、モバイルデバイスやリソースが限られた環境での利用に適しています。この機能追加は、Goの暗号化機能の現代化と、より効率的な暗号化アルゴリズムへの対応を促進します。

log/syslog パッケージの定数追加

  • LOG_AUTH, LOG_CRON, LOG_DAEMON などのSyslogプライオリティおよびファシリティ定数が、様々なOS(darwin, freebsd, linux)およびアーキテクチャ(386, amd64, arm)の組み合わせに対して追加されました。これらの定数は、Syslogメッセージの重要度(プライオリティ)とメッセージを生成したプログラムの種類(ファシリティ)を識別するために使用されます。これにより、GoアプリケーションがSyslogプロトコルを使用してシステムログをより詳細に、かつプラットフォームに依存しない形で記録できるようになります。例えば、認証関連のログは LOG_AUTH ファシリティで、システムデーモンからのログは LOG_DAEMON ファシリティで記録するといった使い分けが可能になり、ログの分析と管理が容易になります。

reflect パッケージの型生成関数

  • ChanOf, MapOf, SliceOf 関数が追加されました。これらはリフレクション機能の一部であり、実行時に動的にチャネル、マップ、スライスの型を生成することを可能にします。例えば、reflect.MapOf(reflect.TypeOf(""), reflect.TypeOf(0))map[string]int 型を表現する reflect.Type を返します。これにより、コンパイル時には型が確定しないような高度なメタプログラミングや、ジェネリックなデータ構造の操作が可能になります。これは、例えば、JSONやProtocol Buffersのようなデータシリアライゼーションライブラリが、任意のGoの構造体を動的にエンコード/デコードする際に非常に役立ちます。

syscall パッケージの TCPInfo

  • Linux-amd64環境向けに syscall.TCPInfo 構造体とそのフィールド(State, Rtt, Rttvar, Snd_cwnd など)が追加されました。これは、Linuxカーネルが提供するTCPソケットの内部状態や統計情報を取得するためのものです。これにより、GoアプリケーションはTCP接続のパフォーマンス監視、デバッグ、輻輳制御アルゴリズムの分析など、低レベルのネットワーク操作をより詳細に行うことができるようになります。例えば、ネットワークのボトルネックを特定したり、アプリケーションのネットワーク動作を最適化したりする際に、この情報が活用されます。

time パッケージの RoundTruncate

  • time.Time 型に Round(d Duration)Truncate(d Duration) メソッドが追加されました。Round は指定された期間 d に最も近い時刻に丸め、Truncate は指定された期間 d の倍数に切り捨てます。これにより、時刻の丸め込みや切り捨てといった一般的な時間操作がより簡単かつ正確に行えるようになります。例えば、特定の時間間隔(例: 1時間ごと、1日ごと)でデータを集計する際に、タイムスタンプを正確に揃えるために非常に便利です。これは、時系列データの処理やレポート生成において頻繁に必要とされる機能です。

その他の注目すべきAPI追加

  • encoding/csv: (*Writer) Error() error メソッドが追加され、CSVライターが書き込み中に発生したエラーをチェックできるようになりました。これにより、CSVファイルの生成におけるエラーハンドリングが改善されます。
  • go/format: Node および Source 関数が追加され、Goのソースコードをプログラム的にフォーマットする機能が提供されます。これは、コード生成ツールやIDEの統合において有用です。
  • net: IPAddr, IPNet, TCPAddr, UDPAddr 構造体に Zone フィールドが追加されました。これは、IPv6のスコープゾーンIDを扱うためのもので、特にリンクローカルアドレスやマルチキャストアドレスの解決において重要です。
  • net/http: CloseNotifier インターフェースが追加され、HTTPハンドラがクライアントの接続切断を検出できるようになりました。これにより、クライアントが接続を閉じた際に、サーバー側でリソースを適切に解放したり、処理を中断したりすることが可能になります。
  • net/mail: ParseAddress および ParseAddressList 関数が追加され、メールアドレスの文字列をRFC 5322に準拠してパースできるようになりました。これにより、メール関連のアプリケーション開発が容易になります。
  • os: (FileMode) IsRegular() メソッドが追加され、os.FileMode が通常のファイルであるかどうかを簡単に判定できるようになりました。
  • regexp: (*Regexp) Split(string, int) []string メソッドが追加され、正規表現を区切り文字として文字列を分割する機能が提供されます。これは、文字列処理において非常に強力なツールとなります。
  • regexp/syntax: ErrUnexpectedParen エラーコードが追加され、正規表現の構文解析における予期せぬ括弧のエラーをより具体的に識別できるようになりました。
  • math/big: (*Int) SetUint64(uint64) *Int(*Int) Uint64() uint64 メソッドが追加され、big.Intuint64 型の間で変換を行う機能が提供されます。これにより、大きな整数と標準の整数型との間の相互運用性が向上します。
  • mime/multipart: (*Writer) SetBoundary(string) error メソッドが追加され、multipart/form-dataの境界文字列を明示的に設定できるようになりました。

これらのAPIの追加は、Go言語が進化し続け、より幅広いユースケースに対応できるようになることを示しています。

コアとなるコードの変更箇所

このコミット自体は api/next.txt というテキストファイルのみを変更しています。このファイルはGoのAPIレビュープロセスの一部であり、実際のGoのソースコード(.goファイル)の変更を直接反映するものではありません。しかし、このファイルに記載された内容は、Goの標準ライブラリの様々なパッケージ(crypto/x509, encoding/csv, go/format, log/syslog, math/big, mime/multipart, net, net/http, net/mail, os, reflect, regexp, regexp/syntax, syscall, time)における実際のAPI追加・変更に対応しています。

api/next.txt の変更箇所は以下の通りです。

--- a/api/next.txt
+++ b/api/next.txt
@@ -22,8 +22,16 @@ pkg crypto/x509, const ExtKeyUsageIPSECEndSystem ExtKeyUsage
 pkg crypto/x509, const ExtKeyUsageIPSECTunnel ExtKeyUsage
 pkg crypto/x509, const ExtKeyUsageIPSECUser ExtKeyUsage
 pkg crypto/x509, const IncompatibleUsage InvalidReason
+pkg crypto/x509, const PEMCipher3DES PEMCipher
+pkg crypto/x509, const PEMCipherAES128 PEMCipher
+pkg crypto/x509, const PEMCipherAES192 PEMCipher
+pkg crypto/x509, const PEMCipherAES256 PEMCipher
+pkg crypto/x509, const PEMCipherDES PEMCipher
 pkg crypto/x509, func DecryptPEMBlock(*pem.Block, []byte) ([]byte, error)
+pkg crypto/x509, func EncryptPEMBlock(io.Reader, string, []byte, []byte, PEMCipher) (*pem.Block, error)
 pkg crypto/x509, func IsEncryptedPEMBlock(*pem.Block) bool
+pkg crypto/x509, func ParseECPrivateKey([]byte) (*ecdsa.PrivateKey, error)
+pkg crypto/x509, type PEMCipher int
 pkg crypto/x509, type VerifyOptions struct, KeyUsages []ExtKeyUsage
 pkg crypto/x509, var IncorrectPasswordError error
 pkg debug/elf, method (*File) DynString(DynTag) ([]string, error)
@@ -43,6 +51,7 @@ pkg debug/pe, type Symbol struct, SectionNumber int16
 pkg debug/pe, type Symbol struct, StorageClass uint8
 pkg debug/pe, type Symbol struct, Type uint16
 pkg debug/pe, type Symbol struct, Value uint32
+pkg encoding/csv, method (*Writer) Error() error
 pkg encoding/json, method (*Decoder) UseNumber()\n pkg encoding/json, method (Number) Float64() (float64, error)\n pkg encoding/json, method (Number) Int64() (int64, error)\n@@ -60,11 +69,237 @@ pkg go/build, type Package struct, SwigCXXFiles []string\n pkg go/build, type Package struct, SwigFiles []string\n pkg go/doc, type Example struct, Play *ast.File\n pkg go/doc, var IllegalPrefixes []string\n+pkg go/format, func Node(io.Writer, *token.FileSet, interface{}) error\n+pkg go/format, func Source([]byte) ([]byte, error)\n+pkg go/printer, type Config struct, Indent int\n pkg image, const YCbCrSubsampleRatio440 YCbCrSubsampleRatio\n pkg io, type ByteWriter interface { WriteByte }\n pkg io, type ByteWriter interface, WriteByte(byte) error\n+pkg log/syslog (darwin-386), const LOG_AUTH Priority\n+pkg log/syslog (darwin-386), const LOG_AUTHPRIV Priority\n+pkg log/syslog (darwin-386), const LOG_CRON Priority\n+pkg log/syslog (darwin-386), const LOG_DAEMON Priority\n+pkg log/syslog (darwin-386), const LOG_FTP Priority\n+pkg log/syslog (darwin-386), const LOG_KERN Priority\n+pkg log/syslog (darwin-386), const LOG_LOCAL0 Priority\n+pkg log/syslog (darwin-386), const LOG_LOCAL1 Priority\n+pkg log/syslog (darwin-386), const LOG_LOCAL2 Priority\n+pkg log/syslog (darwin-386), const LOG_LOCAL3 Priority\n+pkg log/syslog (darwin-386), const LOG_LOCAL4 Priority\n+pkg log/syslog (darwin-386), const LOG_LOCAL5 Priority\n+pkg log/syslog (darwin-386), const LOG_LOCAL6 Priority\n+pkg log/syslog (darwin-386), const LOG_LOCAL7 Priority\n+pkg log/syslog (darwin-386), const LOG_LPR Priority\n+pkg log/syslog (darwin-386), const LOG_MAIL Priority\n+pkg log/syslog (darwin-386), const LOG_NEWS Priority\n+pkg log/syslog (darwin-386), const LOG_SYSLOG Priority\n+pkg log/syslog (darwin-386), const LOG_USER Priority\n+pkg log/syslog (darwin-386), const LOG_UUCP Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_AUTH Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_AUTHPRIV Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_CRON Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_DAEMON Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_FTP Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_KERN Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_LOCAL0 Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_LOCAL1 Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_LOCAL2 Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_LOCAL3 Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_LOCAL4 Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_LOCAL5 Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_LOCAL6 Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_LOCAL7 Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_LPR Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_MAIL Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_NEWS Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_SYSLOG Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_USER Priority\n+pkg log/syslog (darwin-386-cgo), const LOG_UUCP Priority\n+pkg log/syslog (darwin-amd64), const LOG_AUTH Priority\n+pkg log/syslog (darwin-amd64), const LOG_AUTHPRIV Priority\n+pkg log/syslog (darwin-amd64), const LOG_CRON Priority\n+pkg log/syslog (darwin-amd64), const LOG_DAEMON Priority\n+pkg log/syslog (darwin-amd64), const LOG_FTP Priority\n+pkg log/syslog (darwin-amd64), const LOG_KERN Priority\n+pkg log/syslog (darwin-amd64), const LOG_LOCAL0 Priority\n+pkg log/syslog (darwin-amd64), const LOG_LOCAL1 Priority\n+pkg log/syslog (darwin-amd64), const LOG_LOCAL2 Priority\n+pkg log/syslog (darwin-amd64), const LOG_LOCAL3 Priority\n+pkg log/syslog (darwin-amd64), const LOG_LOCAL4 Priority\n+pkg log/syslog (darwin-amd64), const LOG_LOCAL5 Priority\n+pkg log/syslog (darwin-amd64), const LOG_LOCAL6 Priority\n+pkg log/syslog (darwin-amd64), const LOG_LOCAL7 Priority\n+pkg log/syslog (darwin-amd64), const LOG_LPR Priority\n+pkg log/syslog (darwin-amd64), const LOG_MAIL Priority\n+pkg log/syslog (darwin-amd64), const LOG_NEWS Priority\n+pkg log/syslog (darwin-amd64), const LOG_SYSLOG Priority\n+pkg log/syslog (darwin-amd64), const LOG_USER Priority\n+pkg log/syslog (darwin-amd64), const LOG_UUCP Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_AUTH Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_AUTHPRIV Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_CRON Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_DAEMON Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_FTP Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_KERN Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_LOCAL0 Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_LOCAL1 Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_LOCAL2 Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_LOCAL3 Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_LOCAL4 Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_LOCAL5 Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_LOCAL6 Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_LOCAL7 Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_LPR Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_MAIL Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_NEWS Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_SYSLOG Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_USER Priority\n+pkg log/syslog (darwin-amd64-cgo), const LOG_UUCP Priority\n+pkg log/syslog (freebsd-386), const LOG_AUTH Priority\n+pkg log/syslog (freebsd-386), const LOG_AUTHPRIV Priority\n+pkg log/syslog (freebsd-386), const LOG_CRON Priority\n+pkg log/syslog (freebsd-386), const LOG_DAEMON Priority\n+pkg log/syslog (freebsd-386), const LOG_FTP Priority\n+pkg log/syslog (freebsd-386), const LOG_KERN Priority\n+pkg log/syslog (freebsd-386), const LOG_LOCAL0 Priority\n+pkg log/syslog (freebsd-386), const LOG_LOCAL1 Priority\n+pkg log/syslog (freebsd-386), const LOG_LOCAL2 Priority\n+pkg log/syslog (freebsd-386), const LOG_LOCAL3 Priority\n+pkg log/syslog (freebsd-386), const LOG_LOCAL4 Priority\n+pkg log/syslog (freebsd-386), const LOG_LOCAL5 Priority\n+pkg log/syslog (freebsd-386), const LOG_LOCAL6 Priority\n+pkg log/syslog (freebsd-386), const LOG_LOCAL7 Priority\n+pkg log/syslog (freebsd-386), const LOG_LPR Priority\n+pkg log/syslog (freebsd-386), const LOG_MAIL Priority\n+pkg log/syslog (freebsd-386), const LOG_NEWS Priority\n+pkg log/syslog (freebsd-386), const LOG_SYSLOG Priority\n+pkg log/syslog (freebsd-386), const LOG_USER Priority\n+pkg log/syslog (freebsd-386), const LOG_UUCP Priority\n+pkg log/syslog (freebsd-amd64), const LOG_AUTH Priority\n+pkg log/syslog (freebsd-amd64), const LOG_AUTHPRIV Priority\n+pkg log/syslog (freebsd-amd64), const LOG_CRON Priority\n+pkg log/syslog (freebsd-amd64), const LOG_DAEMON Priority\n+pkg log/syslog (freebsd-amd64), const LOG_FTP Priority\n+pkg log/syslog (freebsd-amd64), const LOG_KERN Priority\n+pkg log/syslog (freebsd-amd64), const LOG_LOCAL0 Priority\n+pkg log/syslog (freebsd-amd64), const LOG_LOCAL1 Priority\n+pkg log/syslog (freebsd-amd64), const LOG_LOCAL2 Priority\n+pkg log/syslog (freebsd-amd64), const LOG_LOCAL3 Priority\n+pkg log/syslog (freebsd-amd64), const LOG_LOCAL4 Priority\n+pkg log/syslog (freebsd-amd64), const LOG_LOCAL5 Priority\n+pkg log/syslog (freebsd-amd64), const LOG_LOCAL6 Priority\n+pkg log/syslog (freebsd-amd64), const LOG_LOCAL7 Priority\n+pkg log/syslog (freebsd-amd64), const LOG_LPR Priority\n+pkg log/syslog (freebsd-amd64), const LOG_MAIL Priority\n+pkg log/syslog (freebsd-amd64), const LOG_NEWS Priority\n+pkg log/syslog (freebsd-amd64), const LOG_SYSLOG Priority\n+pkg log/syslog (freebsd-amd64), const LOG_USER Priority\n+pkg log/syslog (freebsd-amd64), const LOG_UUCP Priority\n+pkg log/syslog (linux-386), const LOG_AUTH Priority\n+pkg log/syslog (linux-386), const LOG_AUTHPRIV Priority\n+pkg log/syslog (linux-386), const LOG_CRON Priority\n+pkg log/syslog (linux-386), const LOG_DAEMON Priority\n+pkg log/syslog (linux-386), const LOG_FTP Priority\n+pkg log/syslog (linux-386), const LOG_KERN Priority\n+pkg log/syslog (linux-386), const LOG_LOCAL0 Priority\n+pkg log/syslog (linux-386), const LOG_LOCAL1 Priority\n+pkg log/syslog (linux-386), const LOG_LOCAL2 Priority\n+pkg log/syslog (linux-386), const LOG_LOCAL3 Priority\n+pkg log/syslog (linux-386), const LOG_LOCAL4 Priority\n+pkg log/syslog (linux-386), const LOG_LOCAL5 Priority\n+pkg log/syslog (linux-386), const LOG_LOCAL6 Priority\n+pkg log/syslog (linux-386), const LOG_LOCAL7 Priority\n+pkg log/syslog (linux-386), const LOG_LPR Priority\n+pkg log/syslog (linux-386), const LOG_MAIL Priority\n+pkg log/syslog (linux-386), const LOG_NEWS Priority\n+pkg log/syslog (linux-386), const LOG_SYSLOG Priority\n+pkg log/syslog (linux-386), const LOG_USER Priority\n+pkg log/syslog (linux-386), const LOG_UUCP Priority\n+pkg log/syslog (linux-386-cgo), const LOG_AUTH Priority\n+pkg log/syslog (linux-386-cgo), const LOG_AUTHPRIV Priority\n+pkg log/syslog (linux-386-cgo), const LOG_CRON Priority\n+pkg log/syslog (linux-386-cgo), const LOG_DAEMON Priority\n+pkg log/syslog (linux-386-cgo), const LOG_FTP Priority\n+pkg log/syslog (linux-386-cgo), const LOG_KERN Priority\n+pkg log/syslog (linux-386-cgo), const LOG_LOCAL0 Priority\n+pkg log/syslog (linux-386-cgo), const LOG_LOCAL1 Priority\n+pkg log/syslog (linux-386-cgo), const LOG_LOCAL2 Priority\n+pkg log/syslog (linux-386-cgo), const LOG_LOCAL3 Priority\n+pkg log/syslog (linux-386-cgo), const LOG_LOCAL4 Priority\n+pkg log/syslog (linux-386-cgo), const LOG_LOCAL5 Priority\n+pkg log/syslog (linux-386-cgo), const LOG_LOCAL6 Priority\n+pkg log/syslog (linux-386-cgo), const LOG_LOCAL7 Priority\n+pkg log/syslog (linux-386-cgo), const LOG_LPR Priority\n+pkg log/syslog (linux-386-cgo), const LOG_MAIL Priority\n+pkg log/syslog (linux-386-cgo), const LOG_NEWS Priority\n+pkg log/syslog (linux-386-cgo), const LOG_SYSLOG Priority\n+pkg log/syslog (linux-386-cgo), const LOG_USER Priority\n+pkg log/syslog (linux-386-cgo), const LOG_UUCP Priority\n+pkg log/syslog (linux-amd64), const LOG_AUTH Priority\n+pkg log/syslog (linux-amd64), const LOG_AUTHPRIV Priority\n+pkg log/syslog (linux-amd64), const LOG_CRON Priority\n+pkg log/syslog (linux-amd64), const LOG_DAEMON Priority\n+pkg log/syslog (linux-amd64), const LOG_FTP Priority\n+pkg log/syslog (linux-amd64), const LOG_KERN Priority\n+pkg log/syslog (linux-amd64), const LOG_LOCAL0 Priority\n+pkg log/syslog (linux-amd64), const LOG_LOCAL1 Priority\n+pkg log/syslog (linux-amd64), const LOG_LOCAL2 Priority\n+pkg log/syslog (linux-amd64), const LOG_LOCAL3 Priority\n+pkg log/syslog (linux-amd64), const LOG_LOCAL4 Priority\n+pkg log/syslog (linux-amd64), const LOG_LOCAL5 Priority\n+pkg log/syslog (linux-amd64), const LOG_LOCAL6 Priority\n+pkg log/syslog (linux-amd64), const LOG_LOCAL7 Priority\n+pkg log/syslog (linux-amd64), const LOG_LPR Priority\n+pkg log/syslog (linux-amd64), const LOG_MAIL Priority\n+pkg log/syslog (linux-amd64), const LOG_NEWS Priority\n+pkg log/syslog (linux-amd64), const LOG_SYSLOG Priority\n+pkg log/syslog (linux-amd64), const LOG_USER Priority\n+pkg log/syslog (linux-amd64), const LOG_UUCP Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_AUTH Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_AUTHPRIV Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_CRON Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_DAEMON Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_FTP Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_KERN Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_LOCAL0 Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_LOCAL1 Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_LOCAL2 Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_LOCAL3 Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_LOCAL4 Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_LOCAL5 Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_LOCAL6 Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_LOCAL7 Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_LPR Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_MAIL Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_NEWS Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_SYSLOG Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_USER Priority\n+pkg log/syslog (linux-amd64-cgo), const LOG_UUCP Priority\n+pkg log/syslog (linux-arm), const LOG_AUTH Priority\n+pkg log/syslog (linux-arm), const LOG_AUTHPRIV Priority\n+pkg log/syslog (linux-arm), const LOG_CRON Priority\n+pkg log/syslog (linux-arm), const LOG_DAEMON Priority\n+pkg log/syslog (linux-arm), const LOG_FTP Priority\n+pkg log/syslog (linux-arm), const LOG_KERN Priority\n+pkg log/syslog (linux-arm), const LOG_LOCAL0 Priority\n+pkg log/syslog (linux-arm), const LOG_LOCAL1 Priority\n+pkg log/syslog (linux-arm), const LOG_LOCAL2 Priority\n+pkg log/syslog (linux-arm), const LOG_LOCAL3 Priority\n+pkg log/syslog (linux-arm), const LOG_LOCAL4 Priority\n+pkg log/syslog (linux-arm), const LOG_LOCAL5 Priority\n+pkg log/syslog (linux-arm), const LOG_LOCAL6 Priority\n+pkg log/syslog (linux-arm), const LOG_LOCAL7 Priority\n+pkg log/syslog (linux-arm), const LOG_LPR Priority\n+pkg log/syslog (linux-arm), const LOG_MAIL Priority\n+pkg log/syslog (linux-arm), const LOG_NEWS Priority\n+pkg log/syslog (linux-arm), const LOG_SYSLOG Priority\n+pkg log/syslog (linux-arm), const LOG_USER Priority\n+pkg log/syslog (linux-arm), const LOG_UUCP Priority\n pkg math/big, method (*Int) MarshalJSON() ([]byte, error)\n+pkg math/big, method (*Int) SetUint64(uint64) *Int\n+pkg math/big, method (*Int) Uint64() uint64\n pkg math/big, method (*Int) UnmarshalJSON([]byte) error\n+pkg mime/multipart, method (*Writer) SetBoundary(string) error\n pkg net, func LookupNS(string) ([]*NS, error)\n pkg net, method (*IPConn) ReadMsgIP([]byte, []byte) (int, int, int, *IPAddr, error)\n pkg net, method (*IPConn) WriteMsgIP([]byte, []byte, *IPAddr) (int, int, error)\n@@ -72,21 +307,31 @@ pkg net, method (*UDPConn) ReadMsgUDP([]byte, []byte) (int, int, int, *UDPAddr,\n pkg net, method (*UDPConn) WriteMsgUDP([]byte, []byte, *UDPAddr) (int, int, error)\n pkg net, method (*UnixConn) CloseRead() error\n pkg net, method (*UnixConn) CloseWrite() error\n+pkg net, type IPAddr struct, Zone string\n+pkg net, type IPNet struct, Zone string\n pkg net, type NS struct\n pkg net, type NS struct, Host string\n+pkg net, type TCPAddr struct, Zone string\n+pkg net, type UDPAddr struct, Zone string\n pkg net/http, func ParseTime(string) (time.Time, error)\n pkg net/http, method (*Request) PostFormValue(string) string\n pkg net/http, method (*ServeMux) Handler(*Request) (Handler, string)\n+pkg net/http, type CloseNotifier interface { CloseNotify }\n+pkg net/http, type CloseNotifier interface, CloseNotify() <-chan bool\n pkg net/http, type Request struct, PostForm url.Values\n pkg net/mail, func ParseAddress(string) (*Address, error)\n pkg net/mail, func ParseAddressList(string) ([]*Address, error)\n pkg net/textproto, func TrimBytes([]byte) []byte\n pkg net/textproto, func TrimString(string) string\n+pkg os, method (FileMode) IsRegular() bool\n pkg reflect, const SelectDefault SelectDir\n pkg reflect, const SelectRecv SelectDir\n pkg reflect, const SelectSend SelectDir\n+pkg reflect, func ChanOf(ChanDir, Type) Type\n pkg reflect, func MakeFunc(Type, func([]Value) []Value) Value\n+pkg reflect, func MapOf(Type, Type) Type\n pkg reflect, func Select([]SelectCase) (int, Value, bool)\n+pkg reflect, func SliceOf(Type) Type\n pkg reflect, method (Value) Convert(Type) Value\n pkg reflect, type SelectCase struct\n pkg reflect, type SelectCase struct, Chan Value\n@@ -94,6 +339,8 @@ pkg reflect, type SelectCase struct, Dir SelectDir\n pkg reflect, type SelectCase struct, Send Value\n pkg reflect, type SelectDir int\n pkg reflect, type Type interface, ConvertibleTo(Type) bool\n+pkg regexp, method (*Regexp) Split(string, int) []string\n+pkg regexp/syntax, const ErrUnexpectedParen ErrorCode\n pkg runtime, func BlockProfile([]BlockProfileRecord) (int, bool)\n pkg runtime, func SetBlockProfileRate(int)\n pkg runtime, method (*BlockProfileRecord) Stack() []uintptr\n@@ -551,6 +798,7 @@ pkg syscall (linux-386-cgo), func Removexattr(string, string) error\n pkg syscall (linux-386-cgo), func Setxattr(string, string, []byte, int) error\n pkg syscall (linux-386-cgo), func SlicePtrFromStrings([]string) ([]*byte, error)\n pkg syscall (linux-386-cgo), type SysProcAttr struct, Ctty int\n+pkg syscall (linux-amd64), const SizeofTCPInfo ideal-int\n pkg syscall (linux-amd64), func GetsockoptUcred(int, int, int) (*Ucred, error)\n pkg syscall (linux-amd64), func Getxattr(string, string, []byte) (int, error)\n pkg syscall (linux-amd64), func Listxattr(string, []byte) (int, error)\n@@ -559,6 +807,39 @@ pkg syscall (linux-amd64), func Removexattr(string, string) error\n pkg syscall (linux-amd64), func Setxattr(string, string, []byte, int) error\n pkg syscall (linux-amd64), func SlicePtrFromStrings([]string) ([]*byte, error)\n pkg syscall (linux-amd64), type SysProcAttr struct, Ctty int\n+pkg syscall (linux-amd64), type TCPInfo struct\n+pkg syscall (linux-amd64), type TCPInfo struct, Advmss uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Ato uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Backoff uint8\n+pkg syscall (linux-amd64), type TCPInfo struct, Ca_state uint8\n+pkg syscall (linux-amd64), type TCPInfo struct, Fackets uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Last_ack_recv uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Last_ack_sent uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Last_data_recv uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Last_data_sent uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Lost uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Options uint8\n+pkg syscall (linux-amd64), type TCPInfo struct, Pad_cgo_0 [2]byte\n+pkg syscall (linux-amd64), type TCPInfo struct, Pmtu uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Probes uint8\n+pkg syscall (linux-amd64), type TCPInfo struct, Rcv_mss uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Rcv_rtt uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Rcv_space uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Rcv_ssthresh uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Reordering uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Retrans uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Retransmits uint8\n+pkg syscall (linux-amd64), type TCPInfo struct, Rto uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Rtt uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Rttvar uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Sacked uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Snd_cwnd uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Snd_mss uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Snd_ssthresh uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, State uint8\n+pkg syscall (linux-amd64), type TCPInfo struct, Total_retrans uint32\n+pkg syscall (linux-amd64), type TCPInfo struct, Unacked uint32\n pkg syscall (linux-amd64-cgo), const SizeofTCPInfo ideal-int\n pkg syscall (linux-amd64-cgo), func GetsockoptUcred(int, int, int) (*Ucred, error)\n pkg syscall (linux-amd64-cgo), func Getxattr(string, string, []byte) (int, error)\n@@ -567,6 +848,38 @@ pkg syscall (linux-amd64-cgo), func Removexattr(string, string) error\n pkg syscall (linux-amd64-cgo), func Setxattr(string, string, []byte, int) error\n pkg syscall (linux-amd64-cgo), func SlicePtrFromStrings([]string) ([]*byte, error)\n pkg syscall (linux-amd64-cgo), type SysProcAttr struct, Ctty int\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Advmss uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Ato uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Backoff uint8\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Ca_state uint8\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Fackets uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Last_ack_recv uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Last_ack_sent uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Last_data_recv uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Last_data_sent uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Lost uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Options uint8\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Pad_cgo_0 [2]byte\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Pmtu uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Probes uint8\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Rcv_mss uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Rcv_rtt uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Rcv_space uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Rcv_ssthresh uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Reordering uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Retrans uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Retransmits uint8\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Rto uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Rtt uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Rttvar uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Sacked uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Snd_cwnd uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Snd_mss uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Snd_ssthresh uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, State uint8\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Total_retrans uint32\n+pkg syscall (linux-amd64-cgo), type TCPInfo struct, Unacked uint32\n pkg syscall (linux-arm), func GetsockoptUcred(int, int, int) (*Ucred, error)\n pkg syscall (linux-arm), func Getxattr(string, string, []byte) (int, error)\n pkg syscall (linux-arm), func Listxattr(string, []byte) (int, error)\n@@ -633,6 +946,9 @@ pkg syscall (windows-amd64), type RawSockaddrInet6 struct, Family uint16\n pkg syscall (windows-amd64), type SysProcAttr struct, CreationFlags uint32\n pkg syscall, func BytePtrFromString(string) (*byte, error)\n pkg syscall, func ByteSliceFromString(string) ([]byte, error)\n+pkg syscall, func NsecToTimespec(int64) Timespec\n+pkg syscall, func TimespecToNsec(Timespec) int64\n+pkg syscall, func UtimesNano(string, []Timespec) error\n pkg syscall, type RawSockaddrInet6 struct\n pkg syscall, type RawSockaddrInet6 struct, Addr [16]byte\n pkg syscall, type RawSockaddrInet6 struct, Flowinfo uint32\n@@ -701,6 +1017,8 @@ pkg text/template/parse, type TemplateNode struct, embedded Pos\n pkg text/template/parse, type TextNode struct, embedded Pos\n pkg text/template/parse, type Tree struct, ParseName string\n pkg text/template/parse, type VariableNode struct, embedded Pos\n+pkg time, method (Time) Round(Duration) Time\n+pkg time, method (Time) Truncate(Duration) Time\n pkg time, method (Time) YearDay() int\n pkg unicode, type RangeTable struct, LatinOffset int\n pkg unicode, var Chakma *RangeTable\n```

## コアとなるコードの解説

このコミットは `api/next.txt` ファイルの更新であり、Goの標準ライブラリの実際のソースコードを変更するものではありません。しかし、このファイルに記載されている各行は、Goの次期リリースで導入される新しいAPI要素を宣言しています。これらのAPIは、Goの標準ライブラリの機能と表現力を向上させるために設計されています。

例えば、`crypto/x509` パッケージに追加された `EncryptPEMBlock` 関数は、PEM形式のデータを安全に暗号化するための機能を提供します。これは、Goアプリケーションが秘密鍵や証明書などの機密情報を扱う際に、より堅牢なセキュリティ対策を講じることを可能にします。この関数は、`io.Reader` からデータを読み込み、指定されたパスワードと暗号化アルゴリズム(`PEMCipher`)を使用してPEMブロックを生成します。これにより、開発者はPEMエンコードされた機密データを簡単に保護できます。

また、`reflect` パッケージに追加された `ChanOf`, `MapOf`, `SliceOf` 関数は、Goのリフレクション機能を大幅に強化します。これにより、開発者は実行時に動的に型を構築し、より柔軟で汎用的なコードを作成できるようになります。例えば、`reflect.MakeFunc` と組み合わせて、任意の型のチャネル、マップ、スライスを動的に生成し、操作することが可能になります。これは、汎用的なデータシリアライザ、ORM(Object-Relational Mapping)ライブラリ、またはテストフレームワークなど、高度なメタプログラミングを必要とするアプリケーションで特に有用です。

`syscall` パッケージの `TCPInfo` 構造体は、LinuxシステムにおけるTCP接続の詳細な状態をGoプログラムから直接取得できるようにします。この構造体には、TCP接続の現在の状態(例: `State`)、往復時間(`Rtt`)、輻輳ウィンドウサイズ(`Snd_cwnd`)、再送回数(`Retransmits`)など、多数のフィールドが含まれています。これにより、ネットワーク診断ツールや高性能なネットワークアプリケーションの開発において、より深いレベルでの制御と監視が可能になります。例えば、ネットワークの遅延やパケットロスをリアルタイムで監視し、それに基づいてアプリケーションの動作を調整するといった高度な機能の実装に貢献します。

これらのAPIの追加は、Go言語が進化し続け、より幅広いユースケースに対応できるようになることを示しています。

## 関連リンク

*   Go言語の公式ドキュメント: [https://golang.org/doc/](https://golang.org/doc/)
*   Go 1の互換性保証: [https://golang.org/doc/go1compat](https://golang.org/doc/go1compat)
*   GoのAPIレビュープロセスに関する情報 (Goの公式ブログやメーリングリストで詳細が見つかる可能性があります)
*   Goの標準ライブラリのソースコード: [https://github.com/golang/go/tree/master/src](https://github.com/golang/go/tree/master/src)

## 参考にした情報源リンク

*   Goの公式ドキュメント (各パッケージのAPIリファレンス)
*   Goのメーリングリストアーカイブ (golang-dev, golang-nuts)
*   GoのIssueトラッカー (GoのGitHubリポジトリ)
*   Wikipedia: [PEM (ファイル形式)](https://ja.wikipedia.org/wiki/PEM_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%BD%A2%E5%BC%8F))
*   Wikipedia: [Syslog](https://ja.wikipedia.org/wiki/Syslog)
*   Wikipedia: [楕円曲線暗号](https://ja.wikipedia.org/wiki/%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E6%9A%97%E5%8F%B7)
*   Linux man pages (TCP_INFO): [https://man7.org/linux/man-pages/man7/tcp.7.html](https://man7.org/linux/man-pages/man7/tcp.7.html)
*   Go Blog: Go 1 and the Future of Go Programs: [https://go.dev/blog/go1compat](https://go.dev/blog/go1compat)