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

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

このコミットは、Go言語の標準ライブラリのAPI変更を記録する api/next.txt ファイルを更新するものです。このファイルは、次のGoリリースで導入される予定の新しいAPI要素(関数、型、定数など)を一覧で示しており、GoのAPI互換性ポリシーにおいて重要な役割を果たします。

コミット

commit 6f6db49de6dbc842ff4114939e6200af7213872d
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Thu Mar 6 01:44:04 2014 -0500

    api: update next.txt
    
    LGTM=bradfitz
    R=golang-codereviews, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/71950043

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

https://github.com/golang/go/commit/6f6db49de6dbc842ff4114939e6200af7213872d

元コミット内容

api: update next.txt

LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/71950043

変更の背景

Go言語は、その安定性と後方互換性を非常に重視しています。新しいリリースごとに、標準ライブラリに追加される新しいAPIは、既存のコードベースに影響を与えないように慎重に管理されます。api/next.txt ファイルは、このプロセスの一部として機能します。

このコミットの背景には、Go 1.3リリースに向けた開発サイクルがあります。Go 1.3では、crypto/tls パッケージにおける楕円曲線暗号のサポート強化、net/http パッケージにおけるHTTP接続管理の改善、syscall パッケージにおけるOS固有のシステムコールへのアクセス拡張など、様々な機能追加や改善が行われました。これらの新しい機能がGoの公開APIとして利用可能になる前に、api/next.txt にそれらのAPIシグネチャを記録することで、APIのレビューと互換性の確認が行われます。

具体的には、このコミットは、Go 1.3で導入される予定の多数の新しいAPI要素を api/next.txt に追加しています。これにより、GoのAPI互換性チェックツールがこれらの新しいAPIを認識し、将来のリリースで意図しないAPIの変更や削除がないことを保証できるようになります。

前提知識の解説

GoのAPI互換性ポリシー

Go言語は「Go 1 Compatibility Promise」という強力な後方互換性ポリシーを持っています。これは、Go 1.xのリリース間で、既存のGo 1プログラムが新しいGo 1.xリリースでコンパイルされ、実行され続けることを保証するものです。このポリシーは、Goエコシステムの安定性と開発者の信頼を維持するために不可欠です。

この互換性ポリシーを維持するために、Goの開発プロセスでは、公開APIの変更を厳密に管理しています。新しいAPIが追加される場合、それは api/next.txt ファイルに記録されます。このファイルは、Goのツールチェーンによって解析され、APIの変更が互換性ポリシーに違反していないかどうかがチェックされます。

api/next.txtapi/go1.txt

  • api/next.txt: 次のGoリリースで導入される予定の新しいAPI要素を記録するファイルです。開発中のAPI変更が一時的にここにリストアップされます。このファイルは、APIのレビューと互換性チェックの対象となります。
  • api/go1.txt: Go 1.xの安定版リリースで利用可能なすべての公開APIを記録するファイルです。新しいGoのバージョンがリリースされる際、api/next.txt の内容が api/go1.txt にマージされ、正式なAPIセットとして確定されます。

このコミットは api/next.txt を更新しているため、ここで追加されたAPIは、当時のGoの次のメジャーリリース(Go 1.3)で導入される予定だったものです。

TLS/SSLと楕円曲線暗号 (ECC)

  • TLS (Transport Layer Security): インターネット上で安全な通信を行うためのプロトコルです。ウェブブラウザとサーバー間のHTTPS通信などで広く利用されています。
  • 楕円曲線暗号 (ECC): 公開鍵暗号の一種で、従来のRSA暗号に比べて短い鍵長で同等のセキュリティ強度を実現できるため、モバイルデバイスやリソースが限られた環境での利用に適しています。TLSプロトコルにおいても、鍵交換やデジタル署名にECCが利用されることがあります。

システムコール (Syscall)

システムコールは、ユーザー空間のプログラムがオペレーティングシステム (OS) のカーネルが提供するサービス(ファイルI/O、ネットワーク通信、メモリ管理など)を利用するためのインターフェースです。Go言語の syscall パッケージは、OS固有のシステムコールへの低レベルなアクセスを提供します。これにより、GoプログラムはOSの機能を直接利用し、より高度な操作やパフォーマンス最適化を行うことができます。

技術的詳細

このコミットによって api/next.txt に追加されたAPIは多岐にわたりますが、特に注目すべきは以下の点です。

crypto/tls パッケージの強化

  • 楕円曲線暗号 (ECC) のサポート強化:
    • const CurveP256 = 23, const CurveP384 = 24, const CurveP521 = 25: これらは、TLSハンドシェイクで使用される特定の楕円曲線(NIST P-256, P-384, P-521)を識別するための定数です。これらの曲線は、TLS 1.2以降で広くサポートされており、強力な暗号化を提供します。
    • type CurveID uint16: 楕円曲線の識別子を表す新しい型が追加されました。これにより、コードの可読性と型安全性が向上します。
    • type Config struct, CurvePreferences []CurveID: TLS設定構造体 ConfigCurvePreferences フィールドが追加されました。これにより、クライアントまたはサーバーが優先する楕円曲線のリストを指定できるようになり、セキュリティと互換性の設定がより柔軟になります。
  • func DialWithDialer(*net.Dialer, string, string, *Config) (*Conn, error): net.Dialer を使用してTLS接続を確立するための新しい関数です。これにより、ネットワーク接続のタイムアウト、Keep-Alive設定など、より詳細なダイヤルオプションをTLS接続に適用できるようになります。
  • type ConnectionState struct, Version uint16: TLS接続の状態を表す ConnectionState 構造体に Version フィールドが追加されました。これにより、確立されたTLS接続が使用しているプロトコルバージョン(例: TLS 1.2, TLS 1.3)をプログラムで確認できるようになります。

これらの変更は、Goの crypto/tls パッケージがより現代的でセキュアなTLS機能に対応し、開発者がより細かくTLS接続を制御できるようにすることを目的としています。

net/http パッケージの改善

  • HTTP接続の状態管理:
    • const StateActive = 1, const StateClosed = 4, const StateHijacked = 3, const StateIdle = 2, const StateNew = 0: HTTP接続のライフサイクルにおける様々な状態を表す新しい定数です。
    • type ConnState int: 接続状態を表す新しい型です。
    • method (ConnState) String() string: ConnState 型の文字列表現を返すメソッドです。
    • type Server struct, ConnState func(net.Conn, ConnState): http.ServerConnState コールバックが追加されました。これにより、サーバーは各HTTP接続の状態変化を監視し、カスタムロジック(例: 接続プールの管理、リソースクリーンアップ)を実行できるようになります。
  • method (*Server) SetKeepAlivesEnabled(bool): HTTPサーバーでKeep-Alive接続を有効/無効にするためのメソッドです。Keep-Aliveは、複数のリクエスト/レスポンスで同じTCP接続を再利用することで、パフォーマンスを向上させます。
  • type Client struct, Timeout time.Duration: http.ClientTimeout フィールドが追加されました。これにより、HTTPリクエスト全体のタイムアウトを設定できるようになり、ネットワークの遅延やサーバーの応答がない場合にハングアップするのを防ぎます。
  • type Response struct, TLS *tls.ConnectionState: HTTPレスポンス構造体に TLS フィールドが追加されました。これにより、HTTPS接続で受信したレスポンスのTLS接続情報を取得できるようになります。
  • type Transport struct, TLSHandshakeTimeout time.Duration: http.TransportTLSHandshakeTimeout フィールドが追加されました。これにより、TLSハンドシェイクのタイムアウトを個別に設定できるようになり、TLSハンドシェイクが長時間かかる場合に備えることができます。
  • type Server struct, ErrorLog *log.Logger: http.ServerErrorLog フィールドが追加されました。これにより、HTTPサーバーのエラーログの出力先をカスタマイズできるようになり、アプリケーションのロギングシステムと統合しやすくなります。

これらの変更は、GoのHTTPサーバーとクライアントがより堅牢で、制御可能で、診断しやすくなることを目指しています。

syscall パッケージの拡張

このコミットでは、syscall パッケージに非常に多くの新しい定数と関数が追加されています。これらは主に、様々なオペレーティングシステム(Darwin, FreeBSD, Linux, NetBSD, OpenBSD)の異なるアーキテクチャ(386, amd64, armなど)におけるシステムコールへのアクセスを拡張するものです。

  • メモリ管理関連: Darwin (macOS) 向けの Mlock, Mlockall, Mprotect, Munlock, Munlockall といった関数が追加されています。これらは、プロセスがメモリページをロックしたり、保護設定を変更したり、ロックを解除したりするためのシステムコールです。リアルタイムアプリケーションやセキュリティが重要なアプリケーションで利用されることがあります。
  • ネットワーク関連: FreeBSD 向けの AF_INET6_SDP, AF_INET_SDP などのアドレスファミリー定数や、MSG_CMSG_CLOEXEC, SOCK_CLOEXEC, SOCK_NONBLOCK などのソケットオプション定数が追加されています。また、Accept4 関数も追加されており、これはソケットを受け入れる際にファイルディスクリプタに CLOEXEC フラグを設定できる accept の拡張版です。
  • ファイルシステム関連: FreeBSD 向けの O_CLOEXEC 定数が追加されています。これは、ファイルを開く際にファイルディスクリプタに CLOEXEC フラグを設定するためのものです。
  • プロセス管理関連: FreeBSD 向けの SYS_ACCEPT4, SYS_BINDAT, SYS_CHFLAGSAT, SYS_CONNECTAT, SYS_PIPE2, SYS_PROCCTL などの新しいシステムコール番号定数が追加されています。これらは、より高度なプロセス間通信やファイル操作を可能にするものです。
  • その他: 各OS/アーキテクチャ固有の様々な定数(例: DLT_MPEG_2_TS (FreeBSDのデータリンクタイプ)、MAP_ALIGNED_SUPER (FreeBSDのmmapフラグ)、MADV_DONTNEED (NetBSDのmadviseフラグ))や構造体のフィールド(例: Flock_t のパディング)が追加されています。

これらの syscall パッケージへの追加は、Goがより多くのOS固有の機能にアクセスできるようになり、低レベルなシステムプログラミングの柔軟性が向上したことを示しています。これにより、Goでより高性能なネットワークアプリケーションやシステムツールを開発する際の選択肢が広がります。

runtime/debug パッケージ

  • func SetPanicOnFault(bool) bool: この関数は、Goランタイムがメモリ保護違反などの致命的なシグナルを受信した際に、パニックを発生させるかどうかを制御します。デバッグや特定の環境での挙動制御に役立ちます。

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

このコミットのコアとなる変更は、api/next.txt ファイルへの大量の行追加です。具体的には、618行が追加されています。

--- a/api/next.txt
+++ b/api/next.txt
@@ -1,10 +1,20 @@
 pkg archive/tar, type Header struct, Xattrs map[string]string
+pkg crypto/tls, const CurveP256 = 23
+pkg crypto/tls, const CurveP256 CurveID
+pkg crypto/tls, const CurveP384 = 24
+pkg crypto/tls, const CurveP384 CurveID
+pkg crypto/tls, const CurveP521 = 25
+pkg crypto/tls, const CurveP521 CurveID
+pkg crypto/tls, func DialWithDialer(*net.Dialer, string, string, *Config) (*Conn, error)
 pkg crypto/tls, func NewLRUClientSessionCache(int) ClientSessionCache
 pkg crypto/tls, type ClientSessionCache interface { Get, Put }
 pkg crypto/tls, type ClientSessionCache interface, Get(string) (*ClientSessionState, bool)
 pkg crypto/tls, type ClientSessionCache interface, Put(string, *ClientSessionState)
 pkg crypto/tls, type ClientSessionState struct
 pkg crypto/tls, type Config struct, ClientSessionCache ClientSessionCache
+pkg crypto/tls, type Config struct, CurvePreferences []CurveID
+pkg crypto/tls, type ConnectionState struct, Version uint16
+pkg crypto/tls, type CurveID uint16
 pkg crypto/x509, func CreateCertificateRequest(io.Reader, *CertificateRequest, interface{}) ([]uint8, error)
 pkg crypto/x509, func ParseCertificateRequest([]uint8) (*CertificateRequest, error)
 pkg crypto/x509, type CertificateRequest struct
@@ -153,6 +163,12 @@ pkg debug/goobj, type Var struct, Kind int
 pkg debug/goobj, type Var struct, Name string
 pkg debug/goobj, type Var struct, Offset int
 pkg debug/goobj, type Var struct, Type SymID
+pkg debug/macho, const CpuArm = 12
+pkg debug/macho, const CpuArm Cpu
+pkg debug/macho, const CpuPpc = 18
+pkg debug/macho, const CpuPpc Cpu
+pkg debug/macho, const CpuPpc64 = 16777234
+pkg debug/macho, const CpuPpc64 Cpu
 pkg debug/macho, const MagicFat = 3405691582
 pkg debug/macho, const MagicFat uint32
 pkg debug/macho, const TypeBundle = 8
@@ -231,14 +247,117 @@ pkg math/big, method (*Int) MarshalText() ([]uint8, error)\n pkg math/big, method (*Int) UnmarshalText([]uint8) error\n pkg math/big, method (*Rat) MarshalText() ([]uint8, error)\n pkg math/big, method (*Rat) UnmarshalText([]uint8) error\n+pkg net, type Dialer struct, KeepAlive time.Duration\n+pkg net/http, const StateActive = 1\n+pkg net/http, const StateActive ConnState
+pkg net/http, const StateClosed = 4
+pkg net/http, const StateClosed ConnState
+pkg net/http, const StateHijacked = 3
+pkg net/http, const StateHijacked ConnState
+pkg net/http, const StateIdle = 2
+pkg net/http, const StateIdle ConnState
+pkg net/http, const StateNew = 0
+pkg net/http, const StateNew ConnState
+pkg net/http, method (*Server) SetKeepAlivesEnabled(bool)\n+pkg net/http, method (ConnState) String() string\n+pkg net/http, type Client struct, Timeout time.Duration\n+pkg net/http, type ConnState int\n+pkg net/http, type Response struct, TLS *tls.ConnectionState\n+pkg net/http, type Server struct, ConnState func(net.Conn, ConnState)\n+pkg net/http, type Server struct, ErrorLog *log.Logger\n+pkg net/http, type Transport struct, TLSHandshakeTimeout time.Duration\n+pkg runtime/debug, func SetPanicOnFault(bool) bool\n pkg sync, method (*Pool) Get() interface{}\n pkg sync, method (*Pool) Put(interface{})\n pkg sync, type Pool struct\n pkg sync, type Pool struct, New func() interface{}\n pkg syscall (darwin-386), func FcntlFlock(uintptr, int, *Flock_t) error\n+pkg syscall (darwin-386), func Mlock([]uint8) error\n+pkg syscall (darwin-386), func Mlockall(int) error\n+pkg syscall (darwin-386), func Mprotect([]uint8, int) error\n+pkg syscall (darwin-386), func Munlock([]uint8) error\n+pkg syscall (darwin-386), func Munlockall() error\n pkg syscall (darwin-386-cgo), func FcntlFlock(uintptr, int, *Flock_t) error\n+pkg syscall (darwin-386-cgo), func Mlock([]uint8) error\n+pkg syscall (darwin-386-cgo), func Mlockall(int) error\n+pkg syscall (darwin-386-cgo), func Mprotect([]uint8, int) error\n+pkg syscall (darwin-386-cgo), func Munlock([]uint8) error\n+pkg syscall (darwin-386-cgo), func Munlockall() error\n pkg syscall (darwin-amd64), func FcntlFlock(uintptr, int, *Flock_t) error\n+pkg syscall (darwin-amd64), func Mlock([]uint8) error\n+pkg syscall (darwin-amd64), func Mlockall(int) error\n+pkg syscall (darwin-amd64), func Mprotect([]uint8, int) error\n+pkg syscall (darwin-amd64), func Munlock([]uint8) error\n+pkg syscall (darwin-amd64), func Munlockall() error\n pkg syscall (darwin-amd64-cgo), func FcntlFlock(uintptr, int, *Flock_t) error\n+pkg syscall (darwin-amd64-cgo), func Mlock([]uint8) error\n+pkg syscall (darwin-amd64-cgo), func Mlockall(int) error\n+pkg syscall (darwin-amd64-cgo), func Mprotect([]uint8, int) error\n+pkg syscall (darwin-amd64-cgo), func Munlock([]uint8) error\n+pkg syscall (darwin-amd64-cgo), func Munlockall() error\n+pkg syscall (freebsd-386), const AF_INET6_SDP = 42\n+pkg syscall (freebsd-386), const AF_INET6_SDP ideal-int\n+pkg syscall (freebsd-386), const AF_INET_SDP = 40\n+pkg syscall (freebsd-386), const AF_INET_SDP ideal-int\n+pkg syscall (freebsd-386), const AF_MAX = 42\n+pkg syscall (freebsd-386), const DLT_MATCHING_MAX = 246\n+pkg syscall (freebsd-386), const DLT_MPEG_2_TS = 243\n+pkg syscall (freebsd-386), const DLT_MPEG_2_TS ideal-int\n+pkg syscall (freebsd-386), const DLT_NFC_LLCP = 245\n+pkg syscall (freebsd-386), const DLT_NFC_LLCP ideal-int\n+pkg syscall (freebsd-386), const DLT_NG40 = 244\n+pkg syscall (freebsd-386), const DLT_NG40 ideal-int\n+pkg syscall (freebsd-386), const ELAST = 96\n+pkg syscall (freebsd-386), const ENOTRECOVERABLE = 95\n+pkg syscall (freebsd-386), const ENOTRECOVERABLE Errno\n+pkg syscall (freebsd-386), const EOWNERDEAD = 96\n+pkg syscall (freebsd-386), const EOWNERDEAD Errno\n+pkg syscall (freebsd-386), const EV_DROP = 4096\n+pkg syscall (freebsd-386), const EV_DROP ideal-int\n+pkg syscall (freebsd-386), const IPPROTO_MPLS = 137\n+pkg syscall (freebsd-386), const IPPROTO_MPLS ideal-int\n+pkg syscall (freebsd-386), const MAP_ALIGNED_SUPER = 16777216\n+pkg syscall (freebsd-386), const MAP_ALIGNED_SUPER ideal-int\n+pkg syscall (freebsd-386), const MAP_ALIGNMENT_MASK = -16777216\n+pkg syscall (freebsd-386), const MAP_ALIGNMENT_MASK ideal-int\n+pkg syscall (freebsd-386), const MAP_ALIGNMENT_SHIFT = 24\n+pkg syscall (freebsd-386), const MAP_ALIGNMENT_SHIFT ideal-int\n+pkg syscall (freebsd-386), const MSG_CMSG_CLOEXEC = 262144\n+pkg syscall (freebsd-386), const NAME_MAX = 255\n+pkg syscall (freebsd-386), const NAME_MAX ideal-int\n+pkg syscall (freebsd-386), const O_CLOEXEC = 1048576\n+pkg syscall (freebsd-386), const RTF_GWFLAG_COMPAT = 2147483648\n+pkg syscall (freebsd-386), const RTF_GWFLAG_COMPAT ideal-int\n+pkg syscall (freebsd-386), const RT_NORTREF = 2\n+pkg syscall (freebsd-386), const RT_NORTREF ideal-int\n+pkg syscall (freebsd-386), const SIGLIBRT = 33\n+pkg syscall (freebsd-386), const SIGLIBRT Signal\n+pkg syscall (freebsd-386), const SOCK_CLOEXEC = 268435456\n+pkg syscall (freebsd-386), const SOCK_CLOEXEC ideal-int\n+pkg syscall (freebsd-386), const SOCK_NONBLOCK = 536870912\n+pkg syscall (freebsd-386), const SOCK_NONBLOCK ideal-int\n+pkg syscall (freebsd-386), const SO_VENDOR = 2147483648\n+pkg syscall (freebsd-386), const SO_VENDOR ideal-int\n+pkg syscall (freebsd-386), const SYS_ACCEPT4 = 541\n+pkg syscall (freebsd-386), const SYS_BINDAT = 538\n+pkg syscall (freebsd-386), const SYS_CHFLAGSAT = 540\n+pkg syscall (freebsd-386), const SYS_CHFLAGSAT ideal-int\n+pkg syscall (freebsd-386), const SYS_CONNECTAT = 539\n+pkg syscall (freebsd-386), const SYS_CONNECTAT ideal-int\n+pkg syscall (freebsd-386), const SYS_PIPE2 = 542\n+pkg syscall (freebsd-386), const SYS_PIPE2 ideal-int\n+pkg syscall (freebsd-386), const SYS_PROCCTL = 544\n+pkg syscall (freebsd-386), const SYS_PROCCTL ideal-int\n+pkg syscall (freebsd-386), const TCP_VENDOR = 2147483648\n+pkg syscall (freebsd-386), const TCP_VENDOR ideal-int\n+pkg syscall (freebsd-386), const WEXITED = 16\n+pkg syscall (freebsd-386), const WTRAPPED = 32\n+pkg syscall (freebsd-386), const WTRAPPED ideal-int\n+pkg syscall (freebsd-386), func Accept4(int, int) (int, Sockaddr, error)\n pkg syscall (freebsd-386), func FcntlFlock(uintptr, int, *Flock_t) error

この差分は、api/next.txt に追加されたAPIのリストの一部を示しています。各行は pkg <パッケージ名>, <APIの種類> <APIシグネチャ> の形式で、新しい公開API要素を記述しています。

コアとなるコードの解説

このコミット自体は、Goのソースコード(.go ファイル)に直接的な機能変更を加えるものではありません。その代わりに、GoのAPI互換性管理システムの一部である api/next.txt ファイルを更新しています。

api/next.txt ファイルは、Goのビルドシステムやツールによって利用されます。具体的には、GoのAPIチェッカー(go tool api コマンドなどで利用される)は、このファイルと api/go1.txt ファイルを比較することで、Goの公開APIが後方互換性を維持しているかどうかを検証します。

このファイルに新しいAPIが追加されるということは、Goの標準ライブラリの対応するパッケージ(例: crypto/tls, net/http, syscall)に、実際にこれらのAPIが実装されたことを意味します。このコミットは、それらの実装が完了し、次のリリースで公開APIとして提供される準備ができたことを示す「マーカー」のような役割を果たします。

したがって、このコミットの「コアとなるコードの解説」は、api/next.txt ファイルの役割と、それがGoのAPI互換性保証においてどのように機能するかを理解することに集約されます。このファイルは、Goの安定性と予測可能性を支える重要なメタデータであり、開発者が安心してGoの新しいバージョンにアップグレードできる基盤を提供します。

関連リンク

参考にした情報源リンク

  • Goの公式ドキュメント
  • GoのGitHubリポジトリのコミット履歴と関連するコードレビュー (CL)
  • TLS/SSLおよび楕円曲線暗号に関する一般的な情報源
  • オペレーティングシステムのシステムコールに関する一般的な情報源
  • api/next.txt および api/go1.txt の役割に関するGoコミュニティの議論やブログ記事 (具体的なURLは特定できないが、一般的な知識として参照)