2016-05-25 9 views
1

複数の通知ソース(チャネル)があり、これらの通知イベントのいくつかで同様のタスクを実行すると仮定します。たとえば、doSomething()を10分ごとに呼び出す場合と、ユーザーからの要求があった場合を考えてみましょう。 Goの実装は次のようなものになる可能性があります。Go言語 - 複数の選択ケースで同じコードを実行する

var ticker = time.NewTicker(10*time.Minute) 
nowDoSomething := make(chan time.Time, 1) 
for { 
    select { 
    case <-ticker.C: 
     nowDoSomething<-time.Now() 

    case <-userReq: // some channel activated occasionally 
     nowDoSomething<-time.Now() 

    case <-nowDoSomething: 
     doSomething() 
    } 
} 

同様の機能を実現する他の方法はおそらく良いでしょうか?

+0

'FMTを行くを選択あなたの親友です、それを使用してください。 – OneOfOne

答えて

-2

doSomething()を呼び出すことができるのであれば、なぜチャンネルを使用して自分自身に信号を送るのですか?私は何かがまさに関数ではないかもしれないことを理解していますが、あなたはいつでもローカルクロージャを使うことができます。

は、実施例を参照してください:あなたはまだこの単純な修正を超えて、それを最適化したい場合は

package main 

import (
    "fmt" 
    "time" 
) 



func someRoutine (userReq chan int) { 
    doSomething := func() { 
     fmt.Printf ("OK %v\n", time.Now()) 
    } 

    var ticker = time.NewTicker(10*time.Second) 
    for { 
    select { 
    case <-ticker.C: 
     doSomething() 
    case <-userReq: // some channel activated occasionally 
     doSomething() 
    } 
    } 
} 

func main() { 
    userReq := make(chan int, 1) 
    go someRoutine(userReq); 

    userReq <- 1 // user requested some action here (just to mark the start) 
    time.Sleep(15*time.Second) 
    userReq <- 1 // user requested some action here 

    time.Sleep(30*time.Second)// Put your own waiting and exiting logic here 
} 

を、利用できるいくつかの選択肢が常にあります。しかし、読んだほうが2つだけのチャンネルでは、時期尚早の最適化をしていないことを確認してください。

+0

Go構文はそれを好まない。このエラーは「選択されたケースはリストにできません」 – hagh

+0

読みやすいように編集されています。元の大失敗を取り除いた。 – Seva

0

おそらくあなたは、この反映パッケージから選択機能を使用して行うことができます:

をFUNC(例[] SelectCase)(選ばれたint型、RECV値、recvOKブール値)

関連する問題