Maison >développement back-end >Golang >Comment fermer la chaîne dans Golang

Comment fermer la chaîne dans Golang

PHPz
PHPzoriginal
2023-04-05 13:48:521141parcourir

Golang est un langage de programmation moderne qui séduit de plus en plus de développeurs par sa simplicité et son efficacité. Dans Golang, le canal est une fonctionnalité très importante, qui peut aider les développeurs à réaliser la synchronisation des données et la communication dans un environnement simultané. Toutefois, dans le processus de développement proprement dit, nous devons également comprendre comment fermer le canal. Cet article explique comment utiliser Golang pour fermer des chaînes.

Quand dois-je fermer la chaîne ?

Dans Golang, le canal est un type de données utilisé pour mettre en œuvre la synchronisation et la communication des données. Normalement, nous utilisons des canaux pour envoyer et recevoir des données. Lorsque nous envoyons des données, si le récepteur a reçu les données, l'opération d'envoi sera bloquée jusqu'à ce que le récepteur prenne les données. S'il n'y a pas de récepteur, l'opération d'envoi sera bloquée jusqu'à ce qu'il y ait un récepteur. De même, lorsque nous recevons des données, si l'expéditeur a déjà envoyé les données, l'opération de réception ne sera pas bloquée. S'il n'y a pas d'expéditeur, l'opération de réception sera bloquée jusqu'à ce qu'il y ait un expéditeur.

Dans certains cas, nous devons fermer la chaîne. Lorsque nous fermons un canal, il ne peut plus être utilisé pour envoyer des données, mais les opérations de réception peuvent toujours continuer jusqu'à ce que toutes les données aient été reçues. Dans Golang, nous pouvons fermer le canal via la fonction close().

Alors, dans quelles circonstances faut-il fermer la chaîne ? Normalement, nous devons fermer le canal dans les situations suivantes :

  1. Lorsque nous savons qu'il n'y a plus de données à envoyer, nous pouvons fermer le canal. Cela permet au destinataire de savoir que toutes les données ont été envoyées.
  2. Lorsque nous devons informer le récepteur qu'aucune donnée ne sera envoyée, nous pouvons fermer le canal. Cette situation est généralement utilisée pour informer le destinataire que l'expéditeur a effectué une opération, telle que la lecture d'un fichier.
  3. Lorsque nous utilisons l'instruction select et devons fermer un canal, nous pouvons utiliser la fonction close(). Cela empêchera la sélection de la clause case dans l’instruction select.

Comment fermer la chaîne ?

Dans Golang, nous pouvons utiliser la fonction close() pour fermer la chaîne. La fonction close() fermera un canal initialisé et ne pourra pas fermer un canal non initialisé.

La syntaxe pour fermer une chaîne est la suivante :

close(ch)

où, ch est la chaîne qui doit être fermée.

Il est à noter que la fermeture d'un canal fermé ou nul provoquera la panique. Par conséquent, avant d’appeler la fonction close(), nous devons d’abord déterminer si le canal a été fermé ou est nul.

Comment déterminer si la chaîne a été fermée ?

Nous pouvons utiliser deux méthodes pour déterminer si la chaîne a été fermée.

La première façon, nous pouvons utiliser le mode ok-idiom dans Golang. Lorsque nous lisons les données d'un canal, si le canal a été fermé, la valeur zéro de l'élément canal et false sera renvoyée. Par conséquent, nous pouvons utiliser cette fonctionnalité pour déterminer si le canal a été fermé. L'exemple de code est le suivant :

// 创建一个长度为3的int类型channel
ch := make(chan int, 3)

// 往channel中发送3条数据
ch <- 1
ch <- 2
ch <- 3

// 关闭channel
close(ch)

// 从channel中读取数据
for {
  // 通过ok-idiom方式读取数据
  if data, ok := <- ch; ok {
    fmt.Println(data)
  } else {
    // channel已经关闭
    break
  }
}

Deuxième façon, nous pouvons utiliser l'itérateur de plage dans Golang pour parcourir le canal. L'itérateur de plage quittera automatiquement la boucle. L'exemple de code est le suivant :

// 创建一个长度为3的int类型channel
ch := make(chan int, 3)

// 往channel中发送3条数据
ch <- 1
ch <- 2
ch <- 3

// 关闭channel
close(ch)

// 使用range迭代器遍历channel
for data := range ch {
  fmt.Println(data)
}

Problème de blocage de chaîne

Lors de l'utilisation de chaînes, nous devons faire attention aux problèmes de blocage de chaîne. Lorsque nous envoyons des données à un canal plein, l'opération d'envoi sera bloquée jusqu'à ce qu'il y ait un espace libre dans le canal ; lorsque nous lisons des données sur un canal vide, l'opération de réception sera bloquée jusqu'à ce qu'il y ait un espace libre dans le canal ; données du canal.

Il y aura également un problème de blocage lors de la fermeture de la chaîne. Lorsque nous envoyons des données vers un canal fermé, l'opération d'envoi sera bloquée jusqu'à ce qu'un récepteur récupère toutes les données du canal. Par exemple, le code suivant :

// 创建一个长度为1的string类型channel
ch := make(chan string, 1)

// 关闭channel
close(ch)

// 往channel中发送数据
ch <- "hello world"

Dans cet exemple, nous créons un canal de type chaîne d'une longueur de 1, puis fermons le canal. Ensuite, nous essayons d'envoyer des données au canal, mais comme le canal a été fermé, l'opération d'envoi sera bloquée jusqu'à ce qu'un récepteur récupère toutes les données du canal.

Résumé

Grâce à l'introduction de cet article, nous avons appris comment fermer la chaîne dans Golang, et également comment déterminer si la chaîne a été fermée. Lorsque nous utilisons des canaux, nous devons prêter attention aux problèmes de blocage des canaux pour éviter les blocages et autres problèmes. Lorsque vous utilisez l'instruction select, vous devez également noter que la fermeture d'un canal peut empêcher la sélection de la clause case dans l'instruction select. J'espère que cet article vous sera utile.

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