Go言語の仕様、効果的なGo、Goメモリモデルを(簡単に)見直しても、Goチャネルがどのように機能するかはまだ分かりません。Goチャネルはどのように実装されていますか?
どのような構造ですか?スレッドセーフなキュー/配列のようなものです。
実装はアーキテクチャによって異なりますか?
Go言語の仕様、効果的なGo、Goメモリモデルを(簡単に)見直しても、Goチャネルがどのように機能するかはまだ分かりません。Goチャネルはどのように実装されていますか?
どのような構造ですか?スレッドセーフなキュー/配列のようなものです。
実装はアーキテクチャによって異なりますか?
チャネルのソースファイルは、(ソースコードのルートから)/src/pkg/runtime/chan.goです。
hchan
はチャネルの中央データ構造であり、リンクリスト(そのゴルーチンとデータ要素へのポインタを保持する)とclosed
フラグを送受信します。 runtime2.goで定義され、OSに応じてmutex(futex)またはセマフォとして機能するLock
埋め込み構造体があります。ロックの実装は、ビルドタグに基づいてlock_futex.go(Linux/Dragonfly/Some BSD)またはlock_sema.go(Windows/OSX/Plan9/Some BSD)にあります。
チャネル操作はすべてこのchan.goファイルに実装されています。したがって、makechan、sendおよびreceive操作、select構文、close、lenおよびcap組み込み関数を見ることができます。
チャネルの内部動作についての詳細な説明は、ドミトリーVyukov自身(Goコア開発者、goroutines、スケジューラ、チャネルなど)によってGo channels on steroidsを読む必要があります。