Im bereitgestellten Code wird ein Timeout-Fall mithilfe einer SELECT-Anweisung und eines time.After()-Aufrufs implementiert. Der Timeout-Fall wird jedoch nicht ausgeführt.
Der Grund dafür ist, dass die Funktion time.After() bei jedem Aufruf einen neuen Kanal erstellt. Wenn die select-Anweisung einen Wert vom c1-Kanal empfängt (in der ersten for-Schleife), wird der vorhandene time.After()-Kanal verworfen. Somit hat der Timeout-Fall nie die Möglichkeit, einen Wert zu empfangen.
Um dieses Problem zu beheben, erstellen Sie den time.After()-Kanal nur einmal, außerhalb der for-Schleife. Dadurch wird sichergestellt, dass während der gesamten Ausführung derselbe Kanal für den Timeout-Fall verwendet wird.
Hier ist der geänderte Code:
func main() { c1 := make(chan int, 1) go func() { for { time.Sleep(1500 * time.Millisecond) c1 <- 10 } }() timeout := time.After(2000 * time.Millisecond) for { select { case i := <-c1: fmt.Println(i) case <-timeout: fmt.Println("TIMEOUT") } } fmt.Scanln() }
Mit dieser Änderung wird der Timeout-Fall nach 2 Sekunden erfolgreich ausgeführt , solange innerhalb dieses Zeitraums kein Wert vom c1-Kanal empfangen wird.
Das obige ist der detaillierte Inhalt vonWarum wird mein Golang-Timeout-Fall nicht ausgelöst, wenn ich Kanäle verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!