Maison > Article > développement back-end > Analyse de la capacité et de la longueur des canaux dans Golang
Analyse de la capacité et de la longueur des chaînes dans Golang
Dans Golang, la chaîne est un mécanisme important pour la communication et la synchronisation entre les goroutines. Il peut être utilisé pour transférer des données entre différentes coroutines afin de réaliser la synchronisation et le partage des données. Lorsque nous utilisons Channel, nous impliquons souvent les concepts de capacité et de longueur du canal. Cet article analysera la capacité et la longueur des canaux dans Golang et l'illustrera avec des exemples de code.
1. Capacité du canal
La capacité du canal est le nombre maximum d'éléments pouvant être stockés. Lorsque vous utilisez la fonction make pour créer un canal, vous pouvez spécifier la capacité du canal via le deuxième paramètre. Par exemple :
ch := make(chan int, 5)
Dans le code ci-dessus, un Channel de type int d'une capacité de 5 est créé. Cela signifie que le Channel peut stocker jusqu'à 5 éléments.
Lors de l'envoi d'un élément vers un canal complet, l'opération d'envoi sera bloquée jusqu'à ce qu'une autre coroutine reçoive un élément du canal. Lors de la réception d'éléments d'un canal vide, l'opération de réception sera également bloquée jusqu'à ce qu'une autre coroutine envoie un élément au canal.
Utilisez la fonction len pour obtenir la longueur actuelle du canal (c'est-à-dire le nombre d'éléments déjà stockés). Par exemple :
length := len(ch)
Dans le code ci-dessus, length obtiendra le nombre d'éléments stockés dans le canal ch.
2. La longueur du canal
La longueur du canal est le nombre d'éléments actuellement stockés. Lors de l'utilisation de la fonction len, si elle est utilisée lors d'une opération de réception, elle renverra le nombre d'éléments du canal qui n'ont pas encore été reçus. S'il est utilisé sur une opération d'envoi, il renverra la différence entre le nombre d'éléments qui n'ont pas encore été reçus et la capacité du canal. Par exemple :
length := len(ch)
Dans le code ci-dessus, length obtiendra le nombre d'éléments stockés dans le canal ch.
Ensuite, nous utilisons des exemples de code pour illustrer les concepts de capacité et de longueur du canal.
package main import ( "fmt" "time" ) func main() { ch := make(chan int, 3) // 创建容量为3的int类型Channel go func() { for i := 1; i <= 5; i++ { ch <- i // 发送元素到Channel中 fmt.Printf("发送了元素:%d,长度:%d,容量:%d ", i, len(ch), cap(ch)) } }() go func() { time.Sleep(2 * time.Second) // 暂停2秒 for i := 1; i <= 5; i++ { num := <-ch // 从Channel中接收元素 fmt.Printf("接收到了元素:%d,长度:%d,容量:%d ", num, len(ch), cap(ch)) } }() time.Sleep(5 * time.Second) // 暂停5秒 }
Dans le code ci-dessus, nous avons créé un canal d'une capacité de 3, puis avons démarré deux coroutines, une pour envoyer des éléments au canal et l'autre pour recevoir des éléments du canal.
Exécutez le code ci-dessus et le résultat est le suivant :
Éléments envoyés : 1, longueur : 1, capacité : 3
Éléments envoyés : 2, longueur : 2, capacité : 3
Éléments envoyés : 3, longueur : 3, capacité :3
Éléments reçus : 1, longueur : 2, capacité : 3
Éléments reçus : 2, longueur : 1, capacité : 3
Éléments reçus : 3, longueur : 0, capacité : 3
Éléments envoyés : 4, longueur : 1, capacité : 3
Éléments envoyés : 5, longueur : 2, capacité : 3
Éléments reçus : 4, longueur : 1, capacité : 3
Éléments reçus : 5, longueur : 0, capacité : 3
Comme on peut le voir à partir de la sortie, lorsque la capacité du canal est pleine, l'opération d'envoi est bloquée et la longueur est égale à la capacité ; lorsque le canal est vide, l'opération de réception est bloquée et la longueur est égale à 0 ;
Résumé :
La capacité et la longueur de Channel sont des attributs importants de Channel dans Golang. La capacité fait référence au nombre maximum d'éléments que le canal peut stocker, et la longueur fait référence au nombre d'éléments qui ont été stockés. Lors de l'utilisation du canal, nous devons prêter attention aux changements de capacité et de longueur du canal pour éviter la perte de données et le blocage de la coroutine.
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!