import (
    "fmt"

    "gopkg.in/robfig/cron.v3"
)

func test(x int) {
    fmt.Println("acessesing device", x)
}
func main() {
    c := cron.New()
    x := make(chan bool)
    devices := [10]int{1,2,3,4,5,6,7,8,9,10}
    for _, va := range devices {
        c.AddFunc("@every 30s", func() { test(va) })
    }

    c.Start()
    <-x
}

上面程序得到的输出:

进入网关13

进入网关13

进入网关13

进入网关13

进入网关13

进入网关13

进入网关13

进入网关13

进入网关13

进入网关13

进入网关13

进入网关13

进入网关13

进入网关13

我喜欢用不同的输入运行相同的功能

每30秒的预期输出

访问网关1

访问网关2

访问网关3

访问网关4

访问网关5

访问网关6

访问网关7

访问网关8

进入网关9

进入网关10

分析解答

您的代码中的问题等同于此处描述的问题:

https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables

要解决这个问题:

for _, va := range devices {
    va := va // create a new "va" variable on each iteration
    c.AddFunc("@every 30s", func() { test(va) })
}