问题: 一个结构体的 一个函数元素,是怎么编译执行的?
下面写一个demo测试一下
package main import "fmt" import "time" type Job struct { JobKey int // jobId = id*10000+serverId Id int // taskID Name string // 任务名称 RunFunc func(time.Duration) *JobResult // 执行函数 } type JobResult struct { OutMsg string ErrMsg string IsOk bool IsTimeout bool } func NewCommandJob(id int, serverId int, name string, command string) *Job { job := &Job{ Id: id, Name: name, } job.JobKey = serverId job.RunFunc = func(timeout time.Duration) (jobresult *JobResult) { jobresult = new(JobResult) jobresult.IsTimeout = false fmt.Println(name) fmt.Println(command) return jobresult } return job } func main() { job := NewCommandJob(10,20,"ssss","ls") fmt.Println(job) timeout := time.Duration(time.Hour * 24) job.RunFunc(timeout) }
执行 go run main.go 结果,打印的 job 结构体数据是 &{20 10 0 0 0 ssss 0xc6340 0 false}
而 job.RunFunc() 执行后,能够正常打印处理 job := NewCommandJob(10,20,"ssss","ls") 传递的参数,说明, 在给job。runfunc = ... 赋值函数代码,在go编译的时候,把所有的变量数据都编译并放到了 job 实例 。
关于 任务执行流程梳理:
启动后,自动加载已经放到数据库的任务,并执行的流程:
1.首先是 main.go 中的 jobs.InitJobs()执行。在 jobs/init.go的InitJobs ,执行先从数据库查询出来需要执行的任务数据,通过jobs/jobs.go 的NewJobFromTask 方法 形成一个job的实例的切片,在这个方法中一个任务根据执行的服务器ip不同,形成一个任务多个job实例。
从源码可以看到 根据 执行服务器的不同区调用了不同的方法,这些方法就是实际对job实例的赋值。这里有最重要的一个属性是 job.RunFunc 这个是 实现任务执行的关键代码之一。