Go语言 - 为多个选择案例运行相同的代码

时间:2016-05-25 22:01:21

标签: select go channel

假设我们有多个通知源(频道),我们希望对其中一些通知事件执行一些类似的任务。例如,考虑我们每10分钟调用doSomething()的情况以及用户请求的情况。 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()
    }
}

实现类似功能的其他方式,或许更好的方法是什么?

2 个答案:

答案 0 :(得分:0)

也许您可以使用反射包中的Select函数来执行此操作:

  

func Select(cases [] SelectCase)(选择int,recv Value,recvOK bool)

答案 1 :(得分:-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
}

如果你仍然想要优化它超出这个简单的修正,总会有一些替代方案。但只需要读取两个通道,请确保您没有进行过早优化。