2017-03-22 2 views
2
package main 

import "fmt" 

var money int = 100 
var update = make(chan int) 

func updateM(count int) { 
    update<- count 
} 

func main() { 
    updateM(200) 
    fmt.Println(<-update) 

} 

, aber wenn ich den Code ändernWarum zeigt dieser Kanalbetrieb einen Deadlock-Fehler?

einen gehen vor updateM (200) dann kein Fehler
func main() { 
     go updateM(200) 
     fmt.Println(<-update) 

    } 

mir jemand sagen könnte hinzufügen, ich bin neu Lerner von Go. Danke vielmals.

Antwort

2

Ein Schreibvorgang in einen ungepufferten Kanal wird blockiert, bis jemand am anderen Ende den Kanal liest. In Ihrem Fall wird updateM auf unbestimmte Zeit blockiert, weil es fortfahren muss, damit es vom Kanal lesen kann, was nicht möglich ist, weil es nicht vom Kanal liest.

Kanäle sind für die Kommunikation zwischen Göroutinen, sie sind nicht sinnvoll für sich selbst zu sprechen.

4

Vom documentation:

Wenn der Kanal ungepuffert ist, hat der Sender blockiert, bis der Empfänger den empfangenen Wert. Wenn der Kanal einen Puffer hat, blockiert der Sender nur, bis der Wert in den Puffer kopiert wurde; Wenn der Puffer voll ist, bedeutet dies zu warten, bis ein Empfänger einen Wert abgerufen hat.

Sie können es nicht durch eine Änderung der Kanalerstellung

var update = make(chan int, 1) 

blockiert, so dass es für einen Artikel in dem Kanal, bevor es blockiert Raum ist.

+0

Danke für Ihre Hilfe –

Verwandte Themen