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

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

青灯夜游
青灯夜游オリジナル
2023-01-10 18:55:561942ブラウズ

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

上記のステートメントは、データ (要素) が 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 までご連絡ください。