[Golang] Über den Sprachkanal Go

Was ist ein Kanal?

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

Vielen Dank für das Lesen bis zum Ende!

Wenn Sie Vorschläge haben, würde ich mich freuen, wenn Sie einen Kommentar abgeben könnten! !!

Recommended Posts

[Golang] Über den Sprachkanal Go
[Golang] Über Go-Sprache Produzent und Konsument
[Golang] Grundlagen der Go-Sprache Über Wertempfänger und Zeigerempfänger
Über Go-Funktionen
[Golang] Go Sprachgrundlagen Was ist Goroutine?
Über Go Interface
Erfahren Sie mehr über Go Slices
Informationen zur Go-Steuerungssyntax
Funktionen der Go-Sprache
Über Go-Module (vgo)
go Sprachen lernen verschiedene Notizen 1
Hallo Welt in GO-Sprache
Versuchen Sie, Yuma in der Sprache Go zu implementieren
Über den Grundtyp von Go
Schreiben Sie einen Test in GO-Sprache + Gin
Machen Sie etwas objektorientiertes in der GO-Sprache
Benennen Sie Regeln, die andere Sprachprogrammierer zumindest beachten sollten