php-Editor Xiaoxin In der Go-Sprache ist ein Kanal ein Mechanismus zum Übertragen von Daten zwischen Goroutinen. Das Verhalten eines Kanals hängt davon ab, wie Nachrichten an ihn gesendet werden. Wenn ein Kanal als gepuffert deklariert wird, legt die Goroutine, die die Nachricht sendet, die Nachricht in den Puffer des Kanals und setzt dann die Ausführung fort. Wenn der Kanal als ungepuffert deklariert wird, blockiert die Goroutine, die die Nachricht sendet, bis eine andere Goroutine die Nachricht vom Kanal empfängt. Daher kann man sagen, dass sich das Verhalten eines Kanals abhängig davon ändert, wie Nachrichten an ihn gesendet werden.
Warum werden diese beiden Codeteile unterschiedlich ausgeführt?
fatal 错误:所有 goroutine 都在休眠 - 死锁!
Fehler zurück. func main() { ch := make(chan int) ch <- 1 fmt.println(<-ch) }
ch := make(chan int) go buffer(ch) fmt.Println(<-ch) fmt.Println(<-ch) } func buffer(ch chan int) { ch <- 2 ch <- 3 }
#1 funktioniert nur dann korrekt, wenn ch als gepufferter Kanal definiert ist. Warum? Warum akzeptiert buffer() in ch 2 Werte, ohne sich zu beschweren?
Sendevorgänge auf ungepufferten Kanälen werden blockiert, bis eine andere Goroutine Daten daraus liest. Aus diesem Grund kommt es beim ersten Teil des Codes zu einem Deadlock: Wenn Sie an den Kanal senden, liest keine andere Goroutine daraus.
Im zweiten Fall sendet eine Goroutine zwei Werte an den Kanal und die Haupt-Goroutine liest beim Senden zweimal aus dem Kanal. Der Kanal akzeptiert nicht zwei Sendevorgänge, sondern einen nach dem anderen, wobei der erste Sendevorgang durch den ersten Lesevorgang und der zweite Sendevorgang durch den zweiten Lesevorgang entsperrt wird.
Das obige ist der detaillierte Inhalt vonÄndert sich das Verhalten eines Go-Kanals abhängig davon, wie Nachrichten an ihn gesendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!