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

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

このコミットは、Go言語の標準ライブラリから src/pkg/old/netchan パッケージを削除するものです。具体的には、common.goexport.goimport.gonetchan_test.go の4つのファイルが削除されています。これは、netchan パッケージが go.exp/old/netchan へ移動されたことによるクリーンアップ作業の一環です。

コミット

commit aa36afed3b521e617a6f396f26b62adb1fb442e5
Author: Rob Pike <r@golang.org>
Date:   Sat Mar 2 11:45:22 2013 -0800

    old/netchan: delete as part of move to go.exp/old/netchan
    
    R=golang-dev, minux.ma
    CC=golang-dev
    https://golang.org/cl/7450050
---
 src/pkg/old/netchan/common.go       | 338 ---------------------------\n
 src/pkg/old/netchan/export.go       | 400 --------------------------------\n
 src/pkg/old/netchan/import.go       | 287 -----------------------\n
 src/pkg/old/netchan/netchan_test.go | 447 ------------------------------------\n
 4 files changed, 1472 deletions(-)

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

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

元コミット内容

このコミットの元々の内容は、old/netchan: delete as part of move to go.exp/old/netchan です。これは、netchan パッケージが go.exp/old/netchan という新しい場所へ移動されたため、古い場所にあるファイルを削除するという明確な意図を示しています。

変更の背景

この変更の背景には、Go言語の進化と、特定の実験的なパッケージの管理方法の変更があります。netchan は、Go言語の初期にネットワーク越しにチャネルを扱うための実験的なパッケージとして導入されました。しかし、Go言語の標準ライブラリが成熟するにつれて、netchan の設計がGoの並行処理モデルやネットワークプログラミングのベストプラクティスと完全に合致しない点が浮上しました。

Go言語の開発チームは、標準ライブラリの安定性と品質を維持するため、実験的または非推奨となったパッケージを go.exp リポジトリに移動する方針を採用しました。go.exp は、Goの実験的なコードや、将来的に標準ライブラリに統合される可能性のあるコード、あるいは非推奨となったが参照のために残しておくコードをホストするための場所です。

このコミットは、netchan がもはや標準ライブラリの一部として維持されるべきではないと判断され、go.exp/old/netchan へ移動された後のクリーンアップ作業として行われました。これにより、Goのメインリポジトリはよりスリムになり、開発者は推奨される最新のAPIに集中できるようになります。

前提知識の解説

Go言語のチャネル (Channels)

Go言語のチャネルは、ゴルーチン(軽量スレッド)間で値を送受信するための強力なプリミティブです。チャネルは、Goの並行処理モデルであるCSP(Communicating Sequential Processes)の中心的な要素であり、共有メモリによる競合状態を避けるための安全な通信手段を提供します。

  • チャネルの作成: ch := make(chan int) のように作成します。
  • 送信: ch <- value のようにチャネルに値を送信します。
  • 受信: value := <-ch のようにチャネルから値を受信します。
  • バッファリング: チャネルはバッファリングすることができます(例: make(chan int, 10))。バッファリングされたチャネルは、バッファが満杯になるまで送信をブロックせず、バッファが空になるまで受信をブロックしません。
  • クローズ: close(ch) でチャネルをクローズできます。クローズされたチャネルからの受信は、バッファ内のすべての値が受信された後にゼロ値と false を返します。

netchan パッケージ (旧来の概念)

netchan パッケージは、Go言語の初期に、ネットワーク越しにGoのチャネルのような通信を実現しようとした実験的な試みでした。これは、異なるマシン上で動作するGoプログラム間で、あたかもローカルのチャネルであるかのようにデータをやり取りできるようにすることを目的としていました。

netchan は、gob エンコーディングを使用してデータをシリアライズし、TCP/IPなどのネットワーク接続を介してチャネルの値を転送しました。Exporter がチャネルを公開し、Importer がそれをリモートから利用するというモデルでした。

しかし、netchan はいくつかの課題を抱えていました。

  • 複雑性: ネットワークの信頼性、エラーハンドリング、接続管理など、分散システム特有の複雑性を抽象化しきれていませんでした。
  • パフォーマンス: gob エンコーディングとネットワーク転送のオーバーヘッドにより、パフォーマンスが問題となる場合がありました。
  • Goの進化: Go言語自体のネットワーク機能(net パッケージ)やRPC(Remote Procedure Call)の仕組みが成熟するにつれて、netchan のアプローチはより低レベルで柔軟なRPCフレームワーク(例: net/rpc)や、より現代的なメッセージキューシステム(例: RabbitMQ, Kafka)の利用に取って代わられるようになりました。

これらの理由から、netchan はGoの標準ライブラリから削除され、go.exp に移動されることになりました。

go.exp リポジトリ

go.exp は、Go言語の実験的なパッケージや、標準ライブラリから削除されたが参照のために残されているパッケージを格納するためのリポジトリです。ここに移動されたパッケージは、Goのメインリポジトリの安定性保証の対象外となり、活発な開発は行われないことがほとんどです。netchango.exp/old/netchan に移動されたのは、この方針に従ったものです。

技術的詳細

このコミットは、src/pkg/old/netchan ディレクトリとその中のすべてのファイルを削除するという、非常に直接的な変更です。削除されたファイルは以下の通りです。

  • src/pkg/old/netchan/common.go: netchan パッケージの共通定義、データ構造(header, request, error_ など)、およびヘルパー関数(encDec によるエンコード/デコード、clientSet によるクライアント管理、drain, sync メソッドなど)が含まれていました。
  • src/pkg/old/netchan/export.go: Exporter 型とその関連メソッドが含まれていました。Exporter は、ローカルのGoチャネルをネットワーク越しに公開するための機能を提供していました。ServeServeConnExportHangup などのメソッドがありました。
  • src/pkg/old/netchan/import.go: Importer 型とその関連メソッドが含まれていました。Importer は、リモートの Exporter からチャネルをインポートし、ローカルのGoチャネルとして利用するための機能を提供していました。NewImporterImportImportNValuesHangup などのメソッドがありました。
  • src/pkg/old/netchan/netchan_test.go: netchan パッケージのテストコードが含まれていました。チャネルの送受信、エラーハンドリング、フロー制御、ハングアップなどのシナリオをテストしていました。

これらのファイルが削除されたことにより、Goの標準ライブラリからは netchan の実装が完全に消滅しました。これは、Goのメインリポジトリが、もはやこの実験的なネットワークチャネルの実装を維持・サポートしないという明確なシグナルです。

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

このコミットにおけるコアとなるコードの変更は、以下の4つのファイルの削除です。

  • src/pkg/old/netchan/common.go
  • src/pkg/old/netchan/export.go
  • src/pkg/old/netchan/import.go
  • src/pkg/old/netchan/netchan_test.go

Gitの差分表示では、これらのファイルが完全に削除されたことが示されています(deleted file mode 100644 およびすべての行が削除されたことを示す - 記号)。

コアとなるコードの解説

このコミットには、新しいコードの追加や既存コードの修正は含まれていません。唯一の「変更」は、前述の4つのファイルがファイルシステムから削除されたことです。

これは、netchan パッケージがGoのメインリポジトリから完全に切り離されたことを意味します。この削除により、Goの標準ライブラリは、より安定した、広く採用されているネットワーク通信メカニズム(例: net/rpc, encoding/gob を直接使用したカスタムプロトコル、またはサードパーティのRPCフレームワークやメッセージキューライブラリ)に焦点を当てることになります。

開発者にとっては、この変更は netchan を使用している既存のコードベースがある場合、そのコードを更新する必要があることを意味します。通常、これは netchan の代わりに net/rpc や他の適切な通信メカニズムに移行することを伴います。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のソースコードリポジトリ
  • Go言語のメーリングリストやIssueトラッカー(netchan の議論や非推奨化に関する情報)
  • go.exp リポジトリの構造と目的に関する情報
  • コミットメッセージに記載されている https://golang.org/cl/7450050 (Go Code Review)