go编程题

你正在为一家互联网金融公司的风控部门开发一个风险控制系统。该系统需要定期对一些指标进行检查,
例如客户的逾期还款率、
平台的资金流动情况等,以便及时发现并处理风险。

我们已经为您提供了一个名为schedule的调度器类,该类可以用来执行定期的任务。在这个类中,
我们定义了一个start方法用来启动一个定期任务,以及一个stop方法用来停止一个正在执行的任务。

你的任务是完成start和stop两个方法,要求如下:

start方法应该在一个新的协程中启动定期任务。
任务的执行周期由ticker字段控制,
任务的执行函数由jobFunc字段指定,
函数的参数由jobParams字段提供。
在每个周期开始时,都应该调用jobFunc函数,并向其传递jobParams作为参数。

如果在start方法执行过程中,从stopCh通道收到了一个消息,则应该停止任务,并退出协程。

stop方法应该向stopCh通道发送一个消息,以便让start方法停止执行定期任务。在发送消息后,
应该调用ticker.Stop方法停止定时器。

package main

import (
	"fmt"
	"time"
)

/*

*/

// type callJobFuncWithParams func(jobFunc interface{}, ...params interface{}) // 一个mock方法,用于模拟各种具体操作

type schedule struct {
	stopCh    chan struct{}
	jobFunc   interface{}
	jobParams []interface{}
	ticker    *time.Ticker
	running   bool
}

func newSchedule(period time.Duration, jobFunc interface{}, params ...interface{}) *schedule {
	return &schedule{
		stopCh:    make(chan struct{}),
		jobFunc:   jobFunc,
		jobParams: params,
		ticker:    time.NewTicker(period),
	}
}

// 请完成下面两个函数
func (s *schedule) start() {
	go func() {
		for {
			select {
			case <-s.ticker.C:
				s.jobFunc.(func(params []interface{}))(s.jobParams)
			case <-s.stopCh:
				s.ticker.Stop()
				return
			default:
			}
		}
	}()
}

func (s *schedule) stop() {
	s.stopCh <- struct{}{}
}

func main() {
	sc := newSchedule(time.Second, func(params []interface{}) {
		fmt.Printf("par=%+v\n", params)
	}, 1, 2)
	sc.start()

	time.Sleep(time.Second * 3)
	sc.stop()
}

posted @ 2024-06-07 16:46  gdut17_2  阅读(26)  评论(0)    收藏  举报