2016-03-25 5 views
1

Ich habe einige gleichzeitige Code, der zwei verschiedene Timeout-Intervalle hat, eine statische und eine dynamische. Ich möchte auf beide gleichermaßen reagieren. Dies ist der Kern davon:Wie reagiere ich auf Eingaben von mehreren Kanälen in Go?

select { 
case <-time.After(staticTimeoutInterval): 
    doSomething() 
case <-time.After(dynamicTimeoutInterval): 
    doSomething() 
} 

Gibt es eine Möglichkeit, doSomething() nur einmal zu schreiben? Es ist seltsam, dass select in dieser Hinsicht nicht so flexibel ist wie switch.

+1

Sie könnten 'timeout: = sTimeout; if dTimeout twotwotwo

Antwort

3

In Ihrem speziellen Fall, dass Sie so etwas wie

timeout := min(staticTimeoutInterval, dynamicTimeoutInterval) 

select { 
case <-time.After(timeout): 
    doSomething() 
} 

func min(a, b time.Duration) int { 
    if a < b { 
     return a 
    } 
    return b 
} 

über die scheinbar inkonsistente Behandlung von switch und select verwenden können ist Kommunikation.

Wenn ich übertreibe kann:

  • switch ist über den Teil nach der case Ausdruck - die case Ausdruck hier ist meist eine einfache, nebenwirkungsfreie Ausdruck
  • select über das Teil ist in die case Ausdruck - die case Ausdruck hier bietet Ihnen die wichtige Kommunikation Nebeneffekt und ist nicht trivial zu implementieren

Wenn Sie in select einen Fallthrough zulassen, können Sie in einigen Fällen ein paar Zeilen speichern, aber es wird oft dazu führen, dass select Aussagen schwieriger zu begründen sind. Angesichts einer ähnlichen Auswahl in anderen Situationen sind die Go-Entwickler fast immer mit mehr Ausführlichkeit, aber einfacher zu verstehen.

0

Was Sie haben, sieht gut aus. select Fälle fallen nicht durch. Und wenn dies der Fall wäre, würde dies die Klarheit beseitigen und die gleiche Anzahl von Codezeilen ergeben. während dieser Aussagen haben ähnliche Syntax, der Zweck der switch verzweigt Ausführung, während der Zweck select -