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

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

青灯夜游
リリース: 2023-01-11 18:03:10
オリジナル
2007 人が閲覧しました

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
関連するチュートリアル
人気のおすすめ
最新のコース
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート