2 回答
TA贡献1828条经验 获得超3个赞
使用闭包创建Action函数:
func MakeAction(job *Job) func() {
return func() {
// function that uses the variable job
}
}
您可以MakeAction像这样使用该函数:
j := &Job{ nil, "foo" }
j.Action = MakeAction(j)
请注意,当有人制作Job结构的副本时,这可能会以意想不到的方式表现- 创建的闭包内的引用MakeAction()仍将指向原始实例(而不是副本)。
TA贡献1966条经验 获得超4个赞
您似乎必须传递Job
对该Action
函数的引用才能使该函数访问Cron
.
package main
import "fmt"
type Job struct {
Action func(*Job)
Cron string
}
func main() {
j := &Job{f, "test"}
fmt.Println("Hello, playground", j)
j.Action(j)
}
func f(j *Job) {
fmt.Println(j.Cron)
}
输出:
Hello, playground &{0x201a0 test}
test
没有一个闭包示例允许您引用自己的结构。
OP补充说:
外部框架预计这样的功能:func()。
我正在将此函数包装到我自制的 struct 中Job,并将其他内容放入该Job结构中。
现在我希望Action可以访问 中的其他字段Job,但似乎不可能。
后面我会Action直接传入外部框架。
我确认,仅通过将func()(来自外部框架)包装在您的结构中并不意味着f可以通过闭包访问结构字段。
您需要单独的初始化,如FUZxxl的回答所示。
否则,该函数(来自外部框架)如何知道Job?
只有当该函数需要一个带有函数的接口Cron(),而不是一个它一无所知的结构体和一个Cron字段时,这才有效。
在这个例子中。
- 2 回答
- 0 关注
- 191 浏览
添加回答
举报