2012-09-17 3 views
8

Mam domyślny przyczynę w instrukcji SELECT, że chcę zrobić nic, tylko kontynuować, ale pozostawiając puste, zatrzymuje niczego w rachunku dziejeGo - Jaki jest odpowiednik "pass" Pythona?

 select { 
     case quit_status := <-quit: 
      if quit_status == true { 
       fmt.Printf("********************* GOROUTINE [%d] Received QUIT MSG\n", id) 
       return 
      } 
     default: 
      fmt.Printf("GOROUTINE [%d] step: %d, NO QUIT MSG\n", id, i) 
     } 
+0

Czy próbowałeś usunięcie komunikatu domyślnego ogóle? –

+0

Nie możesz po prostu całkowicie pominąć klauzuli "default"? – verdesmarald

Odpowiedz

9

default przypadek w select oświadczenie ma na celu zapewnia nie blokujące wejścia/wyjścia dla odczytu i zapisu kanałów. Kod w przypadku default jest wykonywany, gdy żaden z kanałów w żadnym z przypadków nie jest gotowy do odczytu/zapisu.

Tak więc w twoim przypadku blok default jest wykonywany, jeśli kanał rezygnacji nie ma nic do powiedzenia. Możesz po prostu usunąć domyślny przypadek, który będzie blokowany na obudowie quit_status := <-quit, dopóki wartość nie będzie dostępna w quit .. prawdopodobnie to jest to, czego szukasz w tym przypadku.

Jeśli chcesz natychmiast kontynuować wykonywanie kodu po select, należy uruchomić to select w oddzielnym goroutine:

go func() { 
    select { 
    case quit_status := <-quit: 
     ... 

    } 
}() 

// Execution continues here immediately. 
+4

Nie ma powodu, aby uruchomić go w innej goroutine. Możesz po prostu wstawić 'default:', a następnie w następnym wierszu zamknij instrukcję select. Wersja "pass" to po prostu nic nie umieszczać. –