Golang map 全局变量使用问题,请各位大佬留步一观。
資深大佬 : PEIENYKYK 35
各位大佬大家好,还是小弟我,这次开发遇到了一个挺坑的问题
首先说一下需求,我要完成一个任务的开始停止,对,就是这么简单。
小弟首先定义了一个全局的 map 变量去存储 job 的信息
//SyncJob 任务详情 type SyncJob struct { ID string Ctx context.Context Cancel context.CancelFunc } //Job 单个同步任务 var Job = make(map[string]interface{}) //JobWork job 列表 var JobWork = make(map[string][]map[string]interface{})
然后我定义了一个 startwork 和 stopwork,
//SyncStart 任务开始 func SyncStart(id string) (msg string, err error) { var job SyncJob ctx, cancel := context.WithCancel(context.Background()) go do work(id) job.ID = id job.Ctx = ctx job.Cancel = cancel Job[id] = job JobWork["job"] = append(JobWork["job"], Job) return "Start work success", nil } //SyncStop 任务结束 func SyncStop(id string) (msg string, err error) { for _, i := range JobWork["job"] { jobss := i[id] op, _ := jobss.(SyncJob) defer op.Cancel() } return "Stop work success", nil }
我尝试了一下这种写法
infiapi.SyncStart("123456") time.Sleep(time.Second * 10) infiapi.SyncStop("123456")
这样是可以停止任务的。 但是!小弟写了一个 web server, 想在 web server 中停止它
func StartSyncwork(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析参数,默认是不会解析的 fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息 id := r.Form["uid"] infiapi.SyncStart(string(id[0])) } func StopSyncWork(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析参数,默认是不会解析的 fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息 id := r.Form["uid"] infiapi.SyncStop(string(id[0])) } ........ http.HandleFunc("/start", StartSyncwork) //设置访问的路由 http.HandleFunc("/stop", StopSyncWork)
这样调用开启可以,但是 stop 无法停止,是 map 作用域的问题么?这样该如何解决呢??拜谢!
大佬有話說 (12)