我有一个结构看起来像这样:
type Job struct {
Action func()
Cron string
}
那么对于这个结构的一个实例,Action
实现中的代码是否有可能获得对Cron
的引用?谢谢。
使用闭包创建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()
创建的闭包内的引用仍将指向原始实例(而不是副本)。
您似乎必须传递对Action
函数的Job
引用,以便该函数访问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()
。
我将这个函数包装到我自制的结构Job
中,并在Job
结构中放入其他内容。
现在我希望Action
可以访问Job
中的其他字段,但这似乎是不可能的。
稍后我将Action
直接传递到外部框架中。
我确认,仅仅通过将func()
(来自外部框架)包装在您的结构中并不意味着f
可以通过闭包访问结构字段。
您需要一个单独的初始化,如 FUZxxl 的答案所示。
否则,该函数(来自外部框架)如何知道Job
?
只有当该函数期望具有Cron()
函数的接口而不是它一无所知的结构具有Cron
字段时,这才有效。
如本例所示。