初始化程序 golang 是否可以实现?
本文介绍了初始化程序 golang 是否可以实现?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
想通过golang读取一个配置文件
通过go方法同时生成X个定时器
同时主进程监听某个端口
当该端口被请求时清除上面生成的几个定时器重新读取配置文件生成新的定时器
不知golang可以实现吗?
求赐教!
谢谢!
解决方案
可以的, 写了段代码,供你参考
演示(如果不动,新窗口打开原图查看):
读取配置文件,按照配置文件中的描述生成定时器,并输出每个定时器中的content内容。
config.json
[
{
"duration": 3,
"content": "hello"
},
{
"duration": 4,
"content": "world"
}
]
main.go
package main
import (
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/http"
"time"
)
type Ticker struct {
Tick *time.Ticker
Status chan bool
Config configTicker
}
var tickers []*Ticker
func init() {
tickers = []*Ticker{}
}
func main() {
newTickers()
http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
newTickers()
io.WriteString(w, "ok")
}))
http.ListenAndServe(":9090", nil)
}
type configTicker struct {
Duration int
Content string
}
func newTickers() {
for _, ticker := range tickers {
ticker.Tick.Stop()
ticker.Status <- false
}
tickers = []*Ticker{}
config := loadConfig()
for _, c := range config {
newTicker(c)
}
}
func newTicker(ct configTicker) {
tick := time.NewTicker(time.Second * time.Duration(ct.Duration))
status := make(chan bool)
ticker := &Ticker{
Tick: tick,
Status: status,
Config: ct,
}
tickers = append(tickers, ticker)
go func() {
running := true
for {
select {
case <-ticker.Tick.C:
fmt.Println(ticker.Config.Content)
case s := <-ticker.Status:
running = s
}
if !running {
break
}
}
}()
}
func loadConfig() []configTicker {
body, _ := ioutil.ReadFile("./config.json")
var c []configTicker
json.Unmarshal(body, &c)
return c
}
这篇关于初始化程序 golang 是否可以实现?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文