Maison  >  Article  >  développement back-end  >  Comment les canaux dans les fonctions Golang sont-ils implémentés ?

Comment les canaux dans les fonctions Golang sont-ils implémentés ?

WBOY
WBOYoriginal
2024-06-03 10:45:571005parcourir

Dans le langage Go, la structure interne du canal comprend les types d'éléments, les pointeurs de tampon, les verrous mutex et les files d'attente d'envoi et de réception. Le mécanisme de l'émetteur-récepteur consiste à réveiller une goroutine pour envoyer ou recevoir des données. Les canaux sont divisés en canaux tamponnés et non tamponnés. Les canaux tamponnés permettent à une goroutine d'envoyer des données sans récepteur, tandis que les canaux non tamponnés nécessitent un récepteur avant l'envoi.

Comment les canaux dans les fonctions Golang sont-ils implémentés ?

Implémentation interne de canaux en langage Go

En langage Go, le canal est une primitive de concurrence très utile qui permet une communication sûre et efficace entre les goroutines. Alors, comment les chaînes sont-elles implémentées dans le langage Go ?

La structure sous-jacente du canal

Le canal dans le langage Go est en fait une structure de données, composée des champs suivants :

  • elemType : Le type des éléments du canal . elemType:通道中元素的类型。
  • buf:通道缓冲区的指针,用于存储传递的数据。
  • lock:用于互斥锁,确保通道的并发访问是安全的。
  • sendq:一个等待发送数据的 goroutine 队列。
  • recvq
  • buf : Pointeur vers le tampon du canal, utilisé pour stocker les données transmises.

lock : utilisé pour les verrouillages mutex pour garantir que l'accès simultané au canal est sécurisé. sendq : Une file d'attente goroutine en attente d'envoi de données.

recvq : Une file d'attente goroutine en attente de recevoir des données.

Mécanisme de transmission et de réception

Lorsqu'une goroutine envoie des données au canal, elle place les données dans le tampon du canal et réveille la goroutine en attente de recevoir les données. De même, lorsqu'une goroutine reçoit des données d'un canal, elle récupère les données du tampon du canal et réveille la goroutine en attente d'envoyer les données.
  • Canaux tamponnés et non tamponnés
  • Il existe deux types de canaux dans le langage Go : les canaux tamponnés et les canaux non tamponnés.
Buffered Channel

a un tampon de taille fixe qui permet à une goroutine d'envoyer des données au canal sans récepteur.

Le canal sans tampon

n'a pas de tampon, il nécessite qu'il y ait un récepteur avant que les données puissent être envoyées.

🎜Cas pratique🎜🎜🎜Voici un exemple simple qui montre comment communiquer entre deux goroutines en utilisant un canal non tamponné : 🎜
package main

import "fmt"
import "time"

func main() {
  ch := make(chan int) // 创建一个无缓冲通道

  go func(ch chan int) {
    for i := 0; i < 5; i++ {
      ch <- i // 发送数据到通道
      fmt.Printf("Sent: %d\n", i)
    }
  }(ch)

  go func(ch chan int) {
    for i := 0; i < 5; i++ {
      val := <-ch // 从通道接收数据
      fmt.Printf("Received: %d\n", val)
    }
  }(ch)

  time.Sleep(5 * time.Second) // 等待 goroutine 完成
}
🎜Cet exemple montre comment deux goroutines peuvent communiquer avec le même canal en même temps. La première goroutine envoie des données, tandis que la seconde goroutine reçoit des données. 🎜

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