“–————人与人之间还是直接点好——————”
package main
import (
"fmt"
"math/rand"
"os"
"os/signal"
"syscall"
"time"
)
const defaultInterval = time.Duration(time.Second * 5) //5秒一次
type timer struct {
Interval time.Duration
//任类型通道
Ch chan struct{}
}
type msg struct {
Rid uint32
Timestamp int64
}
func Newbeats() *msg {
return &msg{
Rid: rand.Uint32(),
Timestamp: time.Now().Unix(),
}
}
func (t *timer) StartBeat() {
t.stop() //并不能停止定时器,程序结束时才停止
go func() {、
//建议点进去看看这个函数
ticker := time.NewTicker(t.Interval)
for {
select { //select函数是等待通道的参数,根据通道是否有输出进行执行
case <-t.Ch: //如果ch通道成功读取数据,则执行该case处理语句
ticker.Stop() //停止通道并不是关闭通道,以防止并发goroutine
return //结束程序,即结束定时器
case <-ticker.C:
}
dd := Newbeats()
fmt.Printf("=== %s\n", dd)
}
}()
}
func (t *timer) stop() {
//通道有东西便停止通道,并不是关闭定时器
if t.Ch != nil {
close(t.Ch)
t.Ch = nil
}
}
func main() {
//1 创建一个信号
c := make(chan os.Signal, 1)
//2 选择监听的内容
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
//开始定时器
Plugin.StartBeat()
//3 只有接到监听的信息才结束程序
<-c
}
//创建实例的第二种方式,直接创建一个变量
//创建一个实例,可以被其它调用 xxx.Plugin.StartBeat()
var Plugin *timer = &timer{
Interval: defaultInterval,
}