Maison  >  Article  >  développement back-end  >  utilisation du golang chan

utilisation du golang chan

PHPz
PHPzoriginal
2023-05-16 15:12:482917parcourir

Golang est un langage fortement typé connu pour sa haute concurrence et sa syntaxe concise. Parmi eux, chan est l'une des méthodes de communication courantes dans Golang et un élément important de la mise en œuvre de la programmation simultanée. Dans cet article, nous examinerons en profondeur l'utilisation et les principes fondamentaux de chan dans Golang.

1. Le concept et la fonction de chan

chan est un moyen important d'établir la communication entre les goroutines dans Golang, appelé pipeline. Il s'agit d'une structure de données thread-safe utilisée pour transmettre des informations dans les programmes Golang. chan peut mettre en œuvre une communication unidirectionnelle et bidirectionnelle, peut être utilisé pour envoyer et recevoir des données et peut également être utilisé pour synchroniser des goroutines.

2. Types et utilisation de chan

Chan dans Golang est un type qui peut être créé à l'aide de la fonction make. La syntaxe est la suivante :

ch := make(chan int)

où int représente le type de données transmises dans le pipeline. Vous devez faire attention aux points suivants lorsque vous utilisez chan :

  1. chan bloque

Les opérations d'envoi et de réception sont bloquantes, c'est-à-dire que s'il n'y a pas de correspondance entre les opérations d'envoi et de réception, la goroutine sera toujours bloquée sur cette opération. Par exemple :

ch := make(chan int)

// 发送操作
go func() {
   ch <- 1
}()

// 接收操作
a := <- ch

Dans cet exemple, nous avons créé un tube de type int et effectué respectivement les opérations d'envoi et de réception. Dans l'opération d'envoi, nous envoyons une valeur 1 au tube ; dans l'opération de réception, nous prenons la valeur du tube et l'attribuons à la variable a. Étant donné que les opérations d'envoi et de réception sont bloquantes, ce programme attendra que les opérations d'envoi et de réception correspondent avant de pouvoir se terminer normalement.

  1. Close chan

Vous pouvez utiliser la fonction de fermeture pour fermer le tuyau. Le tuyau fermé ne peut pas être renvoyé. Par exemple :

ch := make(chan int)

// 发送操作
go func() {
   ch <- 1
   close(ch)
}()

// 循环接收操作
for {
   if val, ok := <-ch; ok {
      fmt.Println(val)
   } else {
      break
   }
}

Dans cet exemple, nous appelons la fonction close après l'opération d'envoi, puis utilisons une boucle for pour recevoir le pipeline. Lors de l'opération de réception, ok est utilisé pour déterminer si le pipeline a été fermé pour éviter un blocage.

  1. Chan à sens unique

Chan à sens unique peut être créé en définissant la direction du tuyau. Par exemple :

ch := make(chan int) // 双向chan

// 定义只能发送的单向chan
sendCh := make(chan <- int)

// 定义只能接收的单向chan
recvCh := make(<- chan int)

// 发送操作时可以使用单向chan
go func() {
   sendCh <- 1
}()

// 接收操作时也可以使用单向chan
a := <-recvCh

Dans cet exemple, nous créons un canal bidirectionnel via la fonction make, puis créons un canal unidirectionnel qui ne peut envoyer et recevoir que via la fonction make. Dans l'opération d'envoi et l'opération de réception, nous utilisons respectivement sendCh et recvCh.

  1. instruction select

l'instruction select peut surveiller l'état de plusieurs pipelines en même temps et peut être utilisée pour des opérations de lecture et d'écriture simultanées des pipelines. Par exemple :

ch1 := make(chan int)
ch2 := make(chan int)

// 发送操作
go func() {
   ch1 <- 1
}()

// 使用select语句并发监听多个管道
select {
case a := <- ch1:
   fmt.Println(a)
case b := <- ch2:
   fmt.Println(b)
}

Dans cet exemple, nous avons créé deux pipelines ch1 et ch2 et envoyé la valeur 1 à ch1 dans une goroutine. Après cela, nous avons utilisé l'instruction select pour écouter les deux tubes, et l'instruction case qui a reçu la première valeur a été exécutée en premier.

3. Le principe de base de chan

Dans Golang, chan est implémenté sur la base d'une structure de données spéciale. Lorsque nous utilisons la fonction make pour créer un chan, nous créons en fait une tranche avec une valeur nulle et une longueur de 0, appelée canal.

Nous pouvons comprendre le principe du chan de la manière suivante :

  1. Opération d'envoi

Lors de l'exécution d'une opération d'envoi, les données à envoyer seront ajoutées à la tranche en bas du canal. Si la longueur du canal est 0, alors l'index de l'élément ajouté est 0. Si la longueur du canal est différente de 0, l'index de l'élément ajouté est la longueur du canal.

Si la longueur du canal a atteint sa limite supérieure de capacité, une tranche plus grande sera créée dans la mémoire et les éléments de la tranche d'origine seront copiés dans la nouvelle tranche. Par conséquent, lors de l’exécution d’une opération d’envoi, des mécanismes de gestion de la mémoire et de copie seront utilisés.

  1. Opération de réception

Lors de l'exécution de l'opération de réception, le premier élément ajouté sera retiré de la tranche en bas du canal. S'il n'y a aucun élément dans la tranche, elle attendra qu'un élément soit disponible ; si le canal a été fermé, l'opération de réception renverra immédiatement une valeur nulle.

  1. Blocage

Lors de l'exécution d'une opération d'envoi ou de réception, si la longueur de tranche du canal a atteint sa limite de capacité supérieure, ou s'il y a déjà des données dans le canal en attente d'être reçues, l'opération d'envoi ou de réception restera bloquée jusqu'à ce qu'il y ait suffisamment d'espace ou de données disponibles.

  1. Opération de fermeture

Lors de la fermeture d'un canal, le statut du canal sera défini sur fermé et les données ne pourront plus être envoyées. S'il y a des données non reçues dans le canal, l'opération de réception peut continuer jusqu'à ce qu'il n'y ait plus de données dans le canal.

Résumé

Chan en Golang est un moyen important d'établir la communication entre les goroutines, et il est également très concis en termes de syntaxe. Maîtriser l'utilisation et les principes de base de chan est très important pour la programmation simultanée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn