Heim > Backend-Entwicklung > Golang > Was ist Chan-Kanal in der Go-Sprache?

Was ist Chan-Kanal in der Go-Sprache?

青灯夜游
Freigeben: 2023-01-11 18:03:10
Original
1984 Leute haben es durchsucht

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.

Was ist Chan-Kanal in der Go-Sprache?

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:

Was ist Chan-Kanal in der Go-Sprache?

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.

Was ist Chan-Kanal in der Go-Sprache?
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
Nach dem Login kopieren

Sie können einen Kanal auch über die Funktion make() mithilfe einer Kurzdeklaration erstellen.

Syntax:

channel_name:= make(chan Type)
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

Ausgabe:

channel的值:  <nil>
channel的类型: chan int
channel1的值: 0xc0000160c0
channel1的类型: chan int
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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("主方法结束") 
}
Nach dem Login kopieren

Ausgabe:

主方法开始
257
主方法结束
Nach dem Login kopieren

[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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage