Maison  >  Article  >  développement back-end  >  Golang ne peut pas utiliser la sélection

Golang ne peut pas utiliser la sélection

WBOY
WBOYoriginal
2023-05-12 20:23:36589parcourir

En langage Go, select est une structure de langage très utile. Il peut attendre de recevoir des données sur plusieurs canaux. Une fois qu'un des canaux a des données à recevoir, il effectuera immédiatement l'opération correspondante. Cependant, il existe certains cas où nous ne pouvons pas utiliser l'instruction select dans le langage Go. Analysons ces situations ci-dessous.

  1. Le canal lui-même ne peut pas utiliser select

La première chose que vous devez comprendre est que lors de la déclaration d'un canal dans le langage Go, vous devez spécifier le type du canal, et select ne peut être utilisé que lorsque le type peut être comparé, copié et fermé. Par exemple, les canaux définis ci-dessous :

c1 := make(chan int)
c2 := make(chan bool)

Ils peuvent tous être sélectionnés, car les types int et bool sont des types de base qui peuvent être comparés.

Cependant, si nous définissons un canal de type structure, nous ne pouvons pas utiliser select directement, par exemple :

type MyStruct struct {
    x int
    y string
}

c := make(chan MyStruct)

Select ne peut pas être utilisé car le type MyStruct n'est pas comparable, il ne peut donc pas être utilisé sur un canal de type MyStruct sélectionner.

  1. L'instruction par défaut doit être traitée

Il existe un cas particulier dans select, qui est l'instruction par défaut, qui sera exécutée lorsque tous les cas ne peuvent pas être exécutés immédiatement. Si nous utilisons l'instruction par défaut dans select, l'instruction par défaut sera également exécutée lorsqu'il y a des données à recevoir dans tous les cas.

Cependant, lors de l'utilisation de l'instruction par défaut, nous devons considérer toutes les situations possibles dans la sélection, y compris celles qui n'ont pas été prises en compte. Si nous ne considérons pas toutes les situations, nous ne pouvons pas utiliser la valeur par défaut, sinon il y aura des bugs potentiels. Par exemple, le code suivant :

select {
case msg1 := <-c1:
    fmt.Println("received", msg1)
case msg2 := <-c2:
    fmt.Println("received", msg2)
default:
    fmt.Println("nothing received") // 未考虑到其他情况的default语句
}

Dans cet exemple, nous n'avons pas pris en compte toutes les autres situations, ce qui peut entraîner l'ignorance ou le traitement incorrect de certaines données. Par conséquent, lorsque nous utilisons l’instruction par défaut, nous devons considérer toutes les situations possibles.

  1. Select ne peut pas être utilisé pendant la communication synchrone

En plus de l'instruction par défaut, il existe également une situation de communication synchrone dans le langage Go, c'est-à-dire que lorsque le tampon du canal est rempli ou plein, les données ne peuvent pas être écrites et doit attendre qu'un autre goroutine reçoive des données. Select ne peut pas être utilisé dans ce cas.

Par exemple, le code suivant :

c := make(chan int, 1)
c <- 1
c <- 2 // 缓冲区已满,此处会堵塞

Dans cet exemple, nous définissons un canal avec un buffer d'une taille de buffer de 1. Écrivez d'abord les données 1 sur le canal, puis écrivez les données 2 sur le canal. À ce moment-là, comme le tampon est plein, cette opération sera bloquée. Si nous essayons de recevoir des données de ce canal en sélection, cette opération sera également bloquée car le tampon est plein et aucune autre opération ne pourra être effectuée.

Par conséquent, lorsque vous utilisez select, vous devez éviter les situations de blocage et vous assurer que les opérations de lecture et d'écriture du canal peuvent être exécutées indépendamment.

En bref, il est très important d'utiliser correctement select en langage Go. Nous devons considérer toutes les situations possibles et éviter les problèmes tels que les erreurs de programmation et les blocages. Dans le même temps, nous devons également être conscients de certaines situations particulières pour éviter d'utiliser select dans des situations inappropriées, entraînant une perte de temps et de ressources.

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