capypad
0 Tage Serie
go / intermediate
Snippet

Nicht-blockierende Kanal-Operationen mit Select

Die 'select'-Anweisung lässt eine Goroutine auf mehrere Kommunikationsoperationen warten. Die Verwendung eines 'default'-Falls ermöglicht nicht-blockierendes Senden und Empfangen, das sofort ausgeführt wird, wenn kein Kanal bereit ist.

snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main
 
import "fmt"
 
func main() {
messages := make(chan string)
signals := make(chan bool)
 
select {
case msg := <-messages:
fmt.Println("received message", msg)
default:
fmt.Println("no message received")
}
 
msg := "hi"
select {
case messages <- msg:
fmt.Println("sent message", msg)
default:
fmt.Println("no message sent")
}
}
Erklärung
1
select { ... }
Blockiert, bis einer der Fälle ausgeführt werden kann, es sei denn, ein default-Fall ist vorhanden.
2
case msg := <-messages:
Versucht, einen Wert aus dem messages-Kanal zu empfangen.
3
default:
Wird ausgeführt, wenn kein anderer Fall bereit ist, wodurch die select-Operation nicht-blockierend wird.