[インデックス 11188] ファイルの概要
このコミットは、Go言語の実験的なSSHパッケージ (exp/ssh
) におけるフィールド名の変更に関するものです。具体的には、client.go
と session.go
内の一部の構造体フィールドが、より明確でGoの命名規約に沿った名前にリファクタリングされています。機能的な変更はなく、コードの可読性と保守性の向上が目的です。
コミット
commit f53cc8e6ffd20e8bc433a3b449f667d4d44585a9
Author: Christopher Wedgwood <cw@f00f.org>
Date: Mon Jan 16 10:09:36 2012 -0500
exp/ssh: rename (some) fields
R=dave, agl, agl
CC=golang-dev
https://golang.org/cl/5494057
---
src/pkg/exp/ssh/client.go | 5 ++---
src/pkg/exp/ssh/session.go | 8 ++++----
2 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/src/pkg/exp/ssh/client.go b/src/pkg/exp/ssh/client.go
index 8df81457bf..eb6c035221 100644
--- a/src/pkg/exp/ssh/client.go
+++ b/src/pkg/exp/ssh/client.go
@@ -306,9 +306,8 @@ type clientChan struct {
stdout *chanReader // receives the payload of channelData messages
stderr *chanReader // receives the payload of channelExtendedData messages
msg chan interface{} // incoming messages
-
- theyClosed bool // indicates the close msg has been received from the remote side
- weClosed bool // incidates the close msg has been sent from our side
+ theyClosed bool // indicates the close msg has been received from the remote side
+ weClosed bool // incidates the close msg has been sent from our side
}
// newClientChan returns a partially constructed *clientChan
diff --git a/src/pkg/exp/ssh/session.go b/src/pkg/exp/ssh/session.go
index 807dd8740d..ea4addbd50 100644
--- a/src/pkg/exp/ssh/session.go
+++ b/src/pkg/exp/ssh/session.go
@@ -70,7 +70,7 @@ type Session struct {
started bool // true once Start, Run or Shell is invoked.
copyFuncs []func() error
- errch chan error // one send per copyFunc
+ errors chan error // one send per copyFunc
// true if pipe method is active
stdinpipe, stdoutpipe, stderrpipe bool
@@ -244,10 +244,10 @@ func (s *Session) start() error {
setupFd(s)
}
- s.errch = make(chan error, len(s.copyFuncs))
+ s.errors = make(chan error, len(s.copyFuncs))
for _, fn := range s.copyFuncs {
go func(fn func() error) {
- s.errch <- fn()
+ s.errors <- fn()
}(fn)
}
return nil
@@ -270,7 +270,7 @@ func (s *Session) Wait() error {
var copyError error
for _ = range s.copyFuncs {
- if err := <-s.errch; err != nil && copyError == nil {
+ if err := <-s.errors; err != nil && copyError == nil {
copyError = err
}
}
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/f53cc8e6ffd20e8bc433a3b449f667d4d44585a9
元コミット内容
exp/ssh: rename (some) fields
R=dave, agl, agl
CC=golang-dev
https://golang.org/cl/5494057
変更の背景
このコミットは、Go言語の標準ライブラリの一部として開発が進められていた実験的なSSHパッケージ (exp/ssh
) の内部的なリファクタリングの一環として行われました。exp
パッケージは、Goの標準ライブラリに最終的に組み込まれる可能性のある、まだ安定していない機能やAPIを先行して開発・テストするために使用されます。
このような実験的な段階では、APIの設計や内部実装の改善が頻繁に行われます。このコミットにおけるフィールド名の変更は、コードの可読性を高め、Goの慣用的な命名規約(Go Idioms)に準拠させることを目的としています。特に、チャネル(chan
)を表すフィールド名に ch
のような短縮形を使用する代わりに、そのチャネルが運ぶデータの種類を直接示す errors
のような名前を使用することは、Goコミュニティで推奨されるプラクティスです。これにより、将来のメンテナンスや新規開発者がコードを理解する際の障壁が低減されます。
前提知識の解説
Go言語の基本
- 構造体 (Structs): Goにおける構造体は、異なる型のフィールドをまとめるためのユーザー定義型です。オブジェクト指向プログラミングにおけるクラスの軽量版と考えることができます。このコミットでは、
clientChan
とSession
という構造体のフィールドが変更されています。 - チャネル (Channels): Goにおけるチャネルは、ゴルーチン(軽量スレッド)間で値を送受信するためのパイプのようなものです。Goの並行処理モデルの根幹をなす要素であり、安全なデータ共有と同期を実現します。このコミットでは、エラーを伝達するためのチャネルの名前が変更されています。
- パッケージ (Packages): Goのコードはパッケージに分割され、関連する機能がまとめられます。
exp/ssh
は、SSHプロトコルを扱うための実験的なパッケージです。
SSH (Secure Shell) プロトコル
- 概要: SSHは、ネットワークを介して安全にコンピュータを操作するためのプロトコルです。リモートコマンド実行、ファイル転送(SCP/SFTP)、ポートフォワーディングなど、様々な機能を提供します。
- クライアント/サーバー: SSH通信は、クライアント(接続を開始する側)とサーバー(接続を受け入れる側)の間で行われます。
exp/ssh
パッケージは、これらの両方の役割を実装するための基盤を提供します。 - セッション (Session): SSH接続が確立されると、その接続上で一つ以上の「セッション」が確立されます。各セッションは、コマンド実行やシェルアクセスなどの論理的なチャネルを提供します。
- チャネル (Channel): SSHプロトコルにおけるチャネルは、論理的な通信ストリームを表します。例えば、標準入力 (stdin)、標準出力 (stdout)、標準エラー出力 (stderr) はそれぞれ異なるチャネルとして扱われることがあります。
Goの exp
パッケージ
Goの標準ライブラリには、exp
というプレフィックスを持つパッケージが存在することがあります。これらは「実験的 (experimental)」なパッケージであり、まだAPIが安定しておらず、将来的に変更される可能性があることを示します。しかし、これらのパッケージは、新しい機能やプロトコルの実装を先行して行い、コミュニティからのフィードバックを得るために公開されます。最終的には、安定したAPIとして標準ライブラリに取り込まれるか、あるいは廃止されるかのいずれかになります。
技術的詳細
このコミットは、主に2つのファイル src/pkg/exp/ssh/client.go
と src/pkg/exp/ssh/session.go
に変更を加えています。
src/pkg/exp/ssh/client.go
の変更
clientChan
構造体内のフィールド theyClosed
と weClosed
の定義が変更されています。
- theyClosed bool // indicates the close msg has been received from the remote side
- weClosed bool // incidates the close msg has been sent from our side
+ theyClosed bool // indicates the close msg has been received from the remote side
+ weClosed bool // incidates the close msg has been sent from our side
この変更は、フィールド名自体を変更するものではなく、主にアライメント(インデント)の調整と、コメントとの間のスペースの調整です。機能的な意味合いは全く変わっていません。これは、コードの整形(go fmt
の適用など)の一環であるか、あるいは手動での整形によるものです。
src/pkg/exp/ssh/session.go
の変更
Session
構造体内の errch
フィールドが errors
にリネームされ、それに伴いこのチャネルを使用している箇所もすべて更新されています。
- errch chan error // one send per copyFunc
+ errors chan error // one send per copyFunc
そして、このチャネルが初期化され、使用される start()
メソッドと Wait()
メソッドでも変更が反映されています。
- s.errch = make(chan error, len(s.copyFuncs))
+ s.errors = make(chan error, len(s.copyFuncs))
for _, fn := range s.copyFuncs {
go func(fn func() error) {
- s.errch <- fn()
+ s.errors <- fn()
}(fn)
}
var copyError error
for _ = range s.copyFuncs {
- if err := <-s.errch; err != nil && copyError == nil {
+ if err := <-s.errors; err != nil && copyError == nil {
copyError = err
}
}
この変更は、Goの命名規約におけるチャネル名の推奨事項に従ったものです。Goでは、チャネルを表す変数名に ch
のような接尾辞を付けることは一般的ではありません。代わりに、チャネルが伝達するデータの種類を直接示す名前(この場合は error
型のデータを伝達するため errors
)を使用することが推奨されます。これにより、コードを読んだ際に、その変数がチャネルであり、どのような目的で使用されるのかが一目で理解しやすくなります。
Session
構造体は、SSHセッションの状態を管理し、コマンドの実行やI/Oのコピーなどを行います。copyFuncs
は、I/Oのコピー操作を行う関数群であり、それぞれの操作で発生したエラーを errors
チャネル(旧 errch
)を通じて収集します。Wait()
メソッドは、これらのコピー操作が完了するのを待ち、発生したエラーを処理します。
コアとなるコードの変更箇所
このコミットのコアとなる変更は、src/pkg/exp/ssh/session.go
内の Session
構造体のフィールド名変更と、それに伴うチャネルの利用箇所の更新です。
--- a/src/pkg/exp/ssh/session.go
+++ b/src/pkg/exp/ssh/session.go
@@ -70,7 +70,7 @@ type Session struct {
started bool // true once Start, Run or Shell is invoked.
copyFuncs []func() error
- errch chan error // one send per copyFunc
+ errors chan error // one send per copyFunc
// true if pipe method is active
stdinpipe, stdoutpipe, stderrpipe bool
@@ -244,10 +244,10 @@ func (s *Session) start() error {
setupFd(s)
}
- s.errch = make(chan error, len(s.copyFuncs))
+ s.errors = make(chan error, len(s.copyFuncs))
for _, fn := range s.copyFuncs {
go func(fn func() error) {
- s.errch <- fn()
+ s.errors <- fn()
}(fn)
}
return nil
@@ -270,7 +270,7 @@ func (s *Session) Wait() error {
var copyError error
for _ = range s.copyFuncs {
- if err := <-s.errch; err != nil && copyError == nil {\n
+ if err := <-s.errors; err != nil && copyError == nil {
copyError = err
}
}
コアとなるコードの解説
Session
構造体は、SSHセッションのライフサイクルと状態を管理します。この構造体には、copyFuncs
というスライスがあり、これはセッションに関連する様々なI/Oコピー操作(例えば、リモートの標準出力からローカルの標準出力へのデータ転送など)を行う関数を保持しています。
以前は、これらのコピー操作中に発生したエラーを収集するために errch
という名前の chan error
型のフィールドが使用されていました。このコミットでは、このフィールド名が errors
に変更されました。
errors chan error
: このチャネルは、Session
内で実行される並行処理(ゴルーチン)からエラーを受け取るために使用されます。make(chan error, len(s.copyFuncs))
でバッファ付きチャネルとして初期化されており、copyFuncs
の数だけエラーを格納できる容量があります。これにより、各コピー関数がエラーをチャネルに送信しても、Wait()
メソッドがそれらを受け取るまでブロックされることなく、ゴルーチンが終了できます。start()
メソッド: このメソッドはセッションを開始し、copyFuncs
に登録された各関数を新しいゴルーチンで実行します。各ゴルーチンは、自身の実行結果(エラーまたはnil)をs.errors
チャネルに送信します。Wait()
メソッド: このメソッドは、すべてのcopyFuncs
が完了するのを待ちます。for _ = range s.copyFuncs
ループは、copyFuncs
の数だけs.errors
チャネルから値を受け取ります。これにより、すべての並行I/O操作が終了したことを確認し、最初に見つかったエラーをcopyError
に格納して返します。
このリネームは、Goの慣用的なスタイルに沿ったものであり、チャネルがエラーのコレクションを運ぶことをより明確に示しています。機能的な動作は一切変更されていませんが、コードの意図がより明確になり、将来のメンテナンス性が向上しています。
関連リンク
- Go言語公式ドキュメント: https://go.dev/doc/
- Go言語のチャネルに関するドキュメント: https://go.dev/tour/concurrency/2
- Go言語の構造体に関するドキュメント: https://go.dev/tour/moretypes/2
- Goの命名規約(Go Proverbsなど): https://go.dev/talks/2012/concurrency.slide#1 (Go ProverbsはGoの設計哲学と慣用的なコーディングスタイルに関する格言集です)
参考にした情報源リンク
- Go言語の公式ドキュメント
- SSHプロトコルの一般的な知識
- Gitのコミットと差分(diff)の読み方に関する知識
- Goの
exp
パッケージに関する一般的な理解