In der Go-Sprache ist ein Kanal (Chan) eine Pipe für die Kommunikation zwischen Goroutinen und ein Medium für Goroutine, um mit einer anderen Goroutine zu kommunizieren. Kanäle sind eine Technologie, die es einer Goroutine ermöglicht, Daten an eine andere Goroutine zu senden. Standardmäßig sind Kanäle bidirektional, was bedeutet, dass eine Goroutine Daten über denselben Kanal senden oder empfangen kann.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.
In der Go-Sprache ist Kanal (Chan) eine Pipeline für die Kommunikation zwischen Goroutinen. Es ist ein Medium für Goroutine, um mit einer anderen Goroutine zu kommunizieren, und diese Kommunikation ist sperrenfrei. Mit anderen Worten: Ein Kanal ist eine Technologie, die es einer Goroutine ermöglicht, Daten an eine andere Goroutine zu senden. Standardmäßig ist der Kanal bidirektional, was bedeutet, dass Goroutine Daten über denselben Kanal senden oder empfangen kann, wie in der folgenden Abbildung dargestellt:
Go-Sprache befürwortet die Verwendung von Kommunikationsmethoden anstelle von Shared Memory, wenn eine Ressource vorhanden ist muss zwischen Goroutinen liegen. Bei der gemeinsamen Nutzung durch Goroutinen überbrückt ein Kanal eine Pipeline zwischen Goroutinen und stellt einen Mechanismus bereit, um sicherzustellen, dass Daten synchron ausgetauscht werden. Wenn Sie einen Kanal deklarieren, müssen Sie die Art der Daten angeben, die geteilt werden sollen. Werte oder Zeiger von integrierten Typen, benannten Typen, Strukturtypen und Referenztypen können über Kanäle gemeinsam genutzt werden.
Die Kommunikationsmethode besteht hier darin, Kanäle zu verwenden, wie in der Abbildung unten dargestellt.
Bild: Kommunikation zwischen Goroutine und Kanal
In Situationen, in denen sich viele Menschen an öffentlichen Orten wie U-Bahn-Stationen, Kantinen und Toiletten aufhalten, hat sich jeder angewöhnt, in der Warteschlange zu stehen. Der Zweck besteht auch darin, eine ineffiziente Nutzung zu vermeiden Ressourcen, die durch Gedränge, Warteschlangen und Austauschprozesse verursacht werden. Das Gleiche gilt für Code und Daten, da mehrere Goroutinen unweigerlich zu einer Ineffizienz bei der Ausführung führen. Der effizienteste Weg ist die Verwendung einer Warteschlangenstruktur.
Eigenschaften von Kanälen
Kanal (Kanal) in der Go-Sprache ist ein besonderer Typ. Zu jedem Zeitpunkt kann nur eine Goroutine auf den Kanal zugreifen, um Daten zu senden und abzurufen. Goroutinen können über Kanäle kommunizieren.
Ein Kanal ist wie ein Förderband oder eine Warteschlange und folgt immer der First In First Out-Regel (First In First Out), um die Reihenfolge beim Senden und Empfangen von Daten sicherzustellen.
Kanal erstellen
In der Go-Sprache verwenden Sie das Schlüsselwort chan, um einen Kanal zu erstellen. Der Kanal kann nur denselben Datentyp übertragen, und unterschiedliche Datentypen dürfen nicht vom selben Kanal übertragen werden .
Syntax:
var Channel_name chan Type
Sie können einen Kanal auch über die Funktion make() mithilfe einer Kurzdeklaration erstellen.
Syntax:
channel_name:= make(chan Type)
Beispiel
package main import "fmt" func main() { //使用var关键字创建通道 var mychannel chan int fmt.Println("channel的值: ", mychannel) fmt.Printf("channel的类型: %T ", mychannel) // 使用 make() 函数创建通道 mychannel1 := make(chan int) fmt.Println("\nchannel1的值:", mychannel1) fmt.Printf("channel1的类型: %T ", mychannel1) }
Ausgabe:
channel的值: <nil> channel的类型: chan int channel1的值: 0xc0000160c0 channel1的类型: chan int
Daten vom Kanal senden und empfangen
In der Go-Sprache hat die Kanalarbeit zwei Hauptoperationen, eine ist das Senden und die andere das Empfangen, diese beiden Operationen werden zusammenfassend als Kommunikation bezeichnet. <-Die Richtung des Operators gibt an, ob Daten empfangen oder gesendet werden sollen. In einem Kanal werden standardmäßig Sende- und Empfangsvorgänge blockiert, bis am anderen Ende keine Daten mehr vorhanden sind. Es ermöglicht Goroutinen die Synchronisierung untereinander ohne explizite Sperren oder Bedingungsvariablen.
1. Sendevorgang: Der Sendevorgang wird verwendet, um mithilfe von Kanälen Daten von einer Goroutine an eine andere Goroutine zu senden. Werte wie int, float64 und bool können sicher und einfach über einen Kanal gesendet werden, da sie kopiert werden, sodass keine Gefahr eines versehentlichen gleichzeitigen Zugriffs auf denselben Wert besteht. Ebenso sind Zeichenfolgen sicher, da sie unveränderlich sind. Das Senden von Zeigern oder Referenzen (z. B. Slices, Kartensammlungen usw.) über Kanäle ist jedoch nicht sicher, da sich der Wert des Zeigers oder der Referenz durch gleichzeitiges Senden oder Empfangen von Goroutinen ändern kann und die Ergebnisse unvorhersehbar sind. Daher müssen Sie bei der Verwendung von Zeigern oder Referenzen in Kanälen sicherstellen, dass jeweils nur eine Goroutine darauf zugreifen kann.
Mychannel <- element
Die obige Anweisung gibt an, dass Daten (Element) mit Hilfe des <-Operators an den Kanal (Mychannel) gesendet werden.
2. Empfangsvorgang: Der Empfangsvorgang dient zum Empfangen der vom sendenden Betreiber gesendeten Daten.
element := <-Mychannel
Die obige Aussage zeigt an, dass das Element Daten vom Kanal (Mychannel) empfängt. Dies ist auch dann eine gültige Anweisung, wenn das Ergebnis der empfangenen Anweisung nicht verfügbar ist (nicht verwendet werden muss). Sie können auch die folgende Empfangsanweisung schreiben:
<-Mychannel
Beispiel
package main import "fmt" func myfunc(ch chan int) { fmt.Println(234 + <-ch) } func main() { fmt.Println("主方法开始") //创建通道l ch := make(chan int) go myfunc(ch) ch <- 23 fmt.Println("主方法结束") }
Ausgabe:
主方法开始 257 主方法结束
[Verwandte Empfehlungen: Go-Video-Tutorial, Programmierunterricht]
Das obige ist der detaillierte Inhalt vonWas ist Chan-Kanal in der Go-Sprache?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!