Da Goroutine parallel läuft, können Daten nicht normal ausgetauscht werden. Sie können jedoch Daten über den Kanal austauschen.
Es ist wie ein Tunnel!
package main
import (
"fmt"
)
func goroutine1(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
//Daten an Kanal senden
c <- sum
}
func main() {
s := []int{1, 2, 3, 4}
c := make(chan int)
go goroutine1(s, c)
//Empfangen Sie die gesendeten Daten
p := <-c
fmt.Println(p) // => 10
}
Der Wert wird mit c <-sum an c gesendet und mit p: = <-c empfangen. Hier wird es blockiert, bis es empfangen wird, und p wartet, bis es eine Summe empfängt. Es ist ähnlich wie bei sync.Wait!
Buffered channels Ein Puffer ist ein Speicherbereich zum vorübergehenden Speichern von Daten, wenn die Verarbeitung von einem Programm ausgeführt wird. Ein Bild, das temporäre Daten auf einem Kanal speichert.
package main
import "fmt"
func main() {
//Es können bis zu 2 Puffer gespeichert werden
ch := make(chan int, 2)
ch <- 100
//len()Sie können die Länge des Kanals mit überprüfen
fmt.Println(len(ch))
ch <- 200
fmt.Println(len(ch))
//Ich erhalte eine Fehlermeldung, wenn ich versuche, die dritten Daten zu senden
ch <- 300
fmt.Println(len(ch)) // => fatal error: all goroutines are asleep - deadlock!
}
Ausführungsergebnis
1
2
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/tmp/sandbox795806942/prog.go:11 +0x16f
Sie können nur bis zu zwei speichern. Der Versuch, den dritten zu senden, führt natürlich zu einem Fehler. (Sackgasse)
Wenn Sie einen Kanal vor sich herausnehmen und 300 wie in ↓ gezeigt senden, tritt kein Fehler auf.
func main() {
ch := make(chan int, 2)
ch <- 100
fmt.Println(len(ch))
ch <- 200
fmt.Println(len(ch))
x := <-ch
fmt.Println(x)
ch <- 300
fmt.Println(len(ch))
}
Ausführungsergebnis
1
2
100
2
Dann schauen Sie sich den Code unten an ↓
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 100
fmt.Println(len(ch))
ch <- 200
fmt.Println(len(ch))
for c := range ch {
fmt.Println(c)
}
}
Dies versucht, den Kanal in Reichweite zu schleifen, aber dies ist ein Fehler.
Ausführungsergebnis
1
2
100
200
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
/tmp/sandbox892357489/prog.go:12 +0x1f3
Dies liegt daran, dass versucht wird, eine Schleife zu einem dritten Kanal durchzuführen, der nicht vorhanden ist. Um die Schleife auf dem zweiten Kanal zu beenden, müssen Sie den Kanal einmal schließen. Dafür ist es notwendig, close (ch) zu beschreiben.
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 100
fmt.Println(len(ch))
ch <- 200
fmt.Println(len(ch))
close(ch)
for c := range ch {
fmt.Println(c)
}
}
Ausführungsergebnis
1
2
100
200
Wenn Sie Vorschläge haben, würde ich mich freuen, wenn Sie einen Kommentar abgeben könnten! !!
Recommended Posts