ホームページ バックエンド開発 Golang Go言語のchanチャンネルとは何ですか

Go言語のchanチャンネルとは何ですか

Jan 10, 2023 pm 06:55 PM
golang 言語を移動 通路

Go 言語では、チャネル (chan) はゴルーチン間の通信パイプであり、ゴルーチンが別のゴルーチンと通信するための媒体です。チャネルは、ある goroutine が別の goroutine にデータを送信できるようにするテクノロジーです。デフォルトでは、チャネルは双方向であり、goroutine が同じチャネルを通じてデータを送受信できることを意味します。

Go言語のchanチャンネルとは何ですか

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

Go 言語では、チャネル (chan) はゴルーチン間の通信用のパイプラインであり、ゴルーチンが別のゴルーチンと通信するための媒体であり、この通信はロックフリーです。言い換えれば、チャネルは、ある goroutine が別の goroutine にデータを送信できるようにするテクノロジーです。デフォルトでは、チャネルは双方向です。これは、次の図に示すように、ゴルーチンが同じチャネルを通じてデータを送受信できることを意味します。代わりに共有メモリ。ゴルーチン間でリソースを共有する必要がある場合、チャネルはゴルーチン間にパイプラインを設定し、データの同期交換を保証するメカニズムを提供します。チャネルを宣言するときは、共有するデータのタイプを指定する必要があります。組み込み型、名前付き型、構造型、および参照型の値またはポインターは、チャネルを通じて共有できます。

ここでの通信方法は、次の図に示すようにチャネルを使用します。 Go言語のchanチャンネルとは何ですか

写真: goroutine とチャネル間の通信

地下鉄の駅、食堂、トイレなどの公共の場所で多くの人がいる状況では、誰もがこの習慣を身につけています。また、混雑やキュージャンプによって発生する非効率的なリソースの使用や交換プロセスも回避できます。コードやデータも同様で、データを奪い合うために複数のゴルーチンが存在すると必然的に実行効率が悪くなります。最も効率的な方法はキューを使用することです。チャネルはキューのような構造です。

Go言語のchanチャンネルとは何ですか

チャネルの特徴

Go言語におけるチャネル(channel)は特殊な型です。常に 1 つの goroutine だけがチャネルにアクセスしてデータを送信および取得できます。 goroutine はチャネルを通じて通信できます。 チャネルはコンベア ベルトまたはキューのようなもので、常に先入れ先出し (先入れ先出し) ルールに従ってデータの送受信の順序を保証します。

チャネルの作成

Go 言語では、chan キーワードを使用してチャネルを作成します。チャネルは同じ種類のデータのみを送信できます。異なるタイプのデータを同じチャネルから転送することを許可しません。 構文:

var Channel_name chan Type
ログイン後にコピー

短縮宣言を使用して、make() 関数を通じてチャネルを作成することもできます。

構文:

channel_name:= make(chan Type)
ログイン後にコピー

package main
import "fmt"
func main() {
    //使用var关键字创建通道
    var mychannel chan int
    fmt.Println("channel的值: ", mychannel)
    fmt.Printf("channel的类型: %T ", mychannel)
    // 使用 make() 函数创建通道
    mychannel1 := make(chan int)
    fmt.Println("\nchannel1的值:", mychannel1)
    fmt.Printf("channel1的类型: %T ", mychannel1)
}
ログイン後にコピー

出力:

channel的值:  <nil>
channel的类型: chan int
channel1的值: 0xc0000160c0
channel1的类型: chan int
ログイン後にコピー

チャネルからのデータの送受信

Go 言語におけるチャネルワークには、送信と受信の 2 つの主な操作があり、これら 2 つの操作を総称して通信と呼びます。 <- オペレーターの指示は、データを受信するか送信するかを示します。デフォルトでは、チャネルでは、相手側にデータがなくなるまで送受信操作がブロックされます。これにより、明示的なロックや条件変数を使用せずにゴルーチンが相互に同期できるようになります。 1. 送信オペレーション

: 送信オペレーションは、チャネルを利用して、ある goroutine から別の goroutine にデータを送信するために使用されます。 int、float64、bool などの値はコピーされるため、チャネル経由で安全かつ簡単に送信できるため、同じ値に誤って同時にアクセスするリスクがありません。同様に、文字列は不変であるため安全です。ただし、チャネルを介してポインターまたは参照 (スライス、マップ コレクションなど) を送信することは安全ではありません。ゴルーチンを同時に送信または受信することによってポインターまたは参照の値が変更される可能性があり、結果が予測できないためです。したがって、チャネルでポインターまたは参照を使用する場合は、一度に 1 つの goroutine のみがそれらにアクセスできるようにする必要があります。

Mychannel <- element
ログイン後にコピー

上記のステートメントは、データ (要素) が <- 演算子を使用してチャネル (Mychannel) に送信されることを示しています。

2. 受信オペレーション

: 受信オペレーションは、送信オペレータによって送信されたデータを受信するために使用されます。

element := <-Mychannel
ログイン後にコピー

上記のステートメントは、要素がチャネル (Mychannel) からデータを受信することを示しています。これは、受信したステートメントの結果が利用できない場合にも有効なステートメントです (使用する必要はありません)。次の受信ステートメントを記述することもできます:

<-Mychannel
ログイン後にコピー
Example
package main 
 
import "fmt"
  
func myfunc(ch chan int) { 
  
    fmt.Println(234 + <-ch) 
} 
func main() { 
    fmt.Println("主方法开始") 
    //创建通道l 
    ch := make(chan int) 
  
    go myfunc(ch) 
    ch <- 23 
    fmt.Println("主方法结束") 
}
ログイン後にコピー

出力:

主方法开始
257
主方法结束
ログイン後にコピー

[関連する推奨事項:

Go ビデオ チュートリアル

プログラミング教育

]

以上がGo言語のchanチャンネルとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

Golangの目的:効率的でスケーラブルなシステムの構築 Golangの目的:効率的でスケーラブルなシステムの構築 Apr 09, 2025 pm 05:17 PM

GO言語は、効率的でスケーラブルなシステムの構築においてうまく機能します。その利点には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時プログラミング:ゴルチンとチャネルを介してマルチタスクを簡素化します。 3。シンプルさ:簡潔な構文、学習コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡単な展開をサポートします。

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

マルチプロセスログを作成するときに、同時性が安全で効率的であることを確認する方法は? マルチプロセスログを作成するときに、同時性が安全で効率的であることを確認する方法は? Apr 02, 2025 pm 03:51 PM

マルチプロセスのログライティングの並行性セキュリティの問題を効率的に処理します。複数のプロセスが同じログファイルを同時に書き込みます。並行性が安全で効率的であることを確認する方法は?これは...

See all articles