如何用Golang的time.Ticker来重复做某事

389 阅读1分钟

我们可以使用time.Sleep ,在未来做一些事情。如果我们使用一个无限循环,我们可以重复地做。然而,有一个更好的选择,它被称为time.Ticker。它是为这类操作设计的,见下面的例子。

睡眠

package main

import (
	"log"
	"time"
)

func main() {
	done := make(chan struct{})
	defer close(done)

	run(done)
}

func run(done <-chan struct{}) {
	i := 1

	for {
		// Do something here
		log.Println(i, "done")

		i++
		if i == 4 {
			return
		}

		select {
		case <-done:
			return
		default:
			time.Sleep(time.Second)
			log.Println("redo")
		}
	}
}

计时器

package main

import (
	"log"
	"time"
)

func main() {
	done := make(chan struct{})
	defer close(done)

	run(done)
}

func run(done <-chan struct{}) {
	i := 1

	ticker := time.NewTicker(time.Second)
	defer ticker.Stop()

	for {
		// Do something here
		log.Println(i, "done")

		i++
		if i == 4 {
			return
		}

		select {
		case <-done:
			return
		case <-ticker.C:
			log.Println("redo")
		}
	}
}

结果

2020/06/16 21:49:27 1 done
2020/06/16 21:49:28 redo
2020/06/16 21:49:28 2 done
2020/06/16 21:49:29 redo
2020/06/16 21:49:29 3 done