Un afficheur de petits points en Go

J'utilise fréquemment un exemple banal de multiprogrammation pour enseigner les threads, exemple dans lequel j'affiche un petit point par seconde à la console jusqu'à ce qu'un usager appuie sur une touche. Ceci permet de combiner opération cyclique qui ne doit pas être bloquée et opération bloquante.

Voici une version Go opérationnelle et sans prétention, pour les curieuses et les curieux. Quelques explications suivent.

package main
import "fmt"
import "time"
func main() {
   signalFin := make(chan bool)
   go func() {
      var touche string
      fmt.Scanln(&touche)
      signalFin <- true
   }();
   for ;; {
      fmt.Print(".")
      select {
         case <-signalFin:
             return
         case <-time.After(time.Second):
            // rien!
      }
   }
}

Portez attention aux éléments suivants :

Dû aux goroutine et aux canaux, cette solution est particulièrement élégante et simple. Notez qu'il aurait été possible de passer signalFin en paramètre à la goroutine en ajustant légèrement l'écriture :

Capture implicite du canal Passage du canal en paramètre
signalFin := make(chan bool)
go func() {
   var touche string
   fmt.Scanln(&touche)
   signalFin <- true
}();
signalFin := make(chan bool)
go func(canal chan bool) {
   var touche string
   fmt.Scanln(&touche)
   canal <- true
}(signalFin);

Dans le cas où une même fonction serait lancée dans plusieurs goroutines, nous pourrions avoir besoin de cette flexibilité.


Valid XHTML 1.0 Transitional

CSS Valide !