go程式設計題

gdut17_2發表於2024-06-07

你正在為一家網際網路金融公司的風控部門開發一個風險控制系統。該系統需要定期對一些指標進行檢查,
例如客戶的逾期還款率、
平臺的資金流動情況等,以便及時發現並處理風險。

我們已經為您提供了一個名為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()
}

相關文章