Maison > Article > développement back-end > Y a-t-il une impasse lors de l'utilisation de deux fmt.println dans une routine go ?
En langage Go, l'utilisation de deux fonctions d'impression fmt.Println() provoquera-t-elle une impasse ? C’est une question courante, répondons-y. Premièrement, nous devons comprendre le concept d’impasse. Un blocage est une situation dans laquelle deux processus ou plus s'attendent l'un l'autre pour se terminer, empêchant le programme de continuer à s'exécuter. Dans le langage Go, si vous utilisez la fonction d'impression fmt.Println() dans deux routines en même temps, puisque la sortie standard est thread-safe, aucun blocage ne se produira. Par conséquent, vous pouvez utiliser en toute sécurité plusieurs fonctions fmt.Println() dans votre routine go sans vous soucier des problèmes de blocage.
J'essaie d'apprendre le go et j'expérimente sur la cour de récréation. J'ai un code très simple. J'essaie d'utiliser des structures et des tranches ensemble dans une routine go. Je ne sais pas si ce serait quelque chose que j'utiliserais en production, mais cela semble un peu bizarre, alors voilà :
func main() { routinemsg := make(chan []Person) routinemsg2 := make(chan []Person) // create the person records p1 := newPerson("john doe", 25) p2 := newPerson("dohn joe", 52) p3 := newPerson("bohn joo", 30) // send a slice of Person to the first routine go func() { routinemsg <- []Person{p1, p2} }() // retrieve the slice from the first routine[in the append] // append p3 to the slice retrieved from the first routine // send the new slice to the second routine go func() { routinemsg2 <- append(<-routinemsg, p3) }() // I am able to see the first Println but when I insert the second one I get a deadlock error // also, same error if I use one Println with 2 arguments. fmt.Println(<-routinemsg) fmt.Println(<-routinemsg2) }
J’ai entendu parler de groupes d’attente mais je ne les connais pas encore ! Alors, soyez gentil avec moi :d, merci d'avoir pris le temps
routinemsg
上只有一个发送操作,但您有 2 个接收操作:一个在启动的 goroutine 中,另一个在 main
dans goroutine. La valeur envoyée ne peut être reçue qu'une seule fois par un destinataire.
Si la goroutine démarrée reçoit de routinemsg
接收,那么就会出现死锁:main
en premier, elle sera bloquée pour toujours.
Si main
goroutine 首先接收,那么启动的 goroutine 将永远阻塞(尝试从中接收),因此它永远无法在 routinemsg2
上发送任何内容,因此 main
中从 routinemsg2
la réception bloque également pour toujours : à nouveau une impasse.
Supprimer main()
中的 fmt.println(<-routinemsg)
行,然后从 routinemsg2
的最终接收可以(最终)继续并打印包含 p1
、p2
和 phpcnc 的切片phpcnp3 :
[{john doe 25} {dohn joe 52} {bohn joo 30}]
Essayez-le sur le go terrain de jeu.
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!