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

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

このコミットは、Go言語の実験的なSSHパッケージ (exp/ssh) におけるフィールド名の変更に関するものです。具体的には、client.gosession.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における構造体は、異なる型のフィールドをまとめるためのユーザー定義型です。オブジェクト指向プログラミングにおけるクラスの軽量版と考えることができます。このコミットでは、clientChanSession という構造体のフィールドが変更されています。
  • チャネル (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.gosrc/pkg/exp/ssh/session.go に変更を加えています。

src/pkg/exp/ssh/client.go の変更

clientChan 構造体内のフィールド theyClosedweClosed の定義が変更されています。

-	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言語の公式ドキュメント
  • SSHプロトコルの一般的な知識
  • Gitのコミットと差分(diff)の読み方に関する知識
  • Goのexpパッケージに関する一般的な理解