我的结构看起来像这样:
type Job struct {
Action func()
Cron string
}
因此,对于此结构的实例,Action
实现中的代码是否可以获得对Cron
的引用?感谢。
答案 0 :(得分:4)
使用闭包创建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()
创建的闭包内的引用仍将指向原始实例(而不是副本) )。
答案 1 :(得分:3)
您似乎必须传递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
closures examples都不允许您引用自己的结构。
OP补充道:
外部框架需要这样的函数:
func()
。
我将此函数包装到我的自制结构Job
中,然后在Job
结构中添加了其他内容。
现在我希望Action
可以访问Job
中的其他字段,但似乎无法实现。
稍后我会将Action
直接传递给外部框架。
我确认,只需将func()
(来自外部框架)包装在您的结构中,并不意味着f
可以通过闭包访问结构字段。
您需要单独初始化,如FUZxxl' s answer shows。
否则,该功能(来自外部框架)如何知道Job
?
只有当该函数期望具有Cron()
函数的接口,而不是一个对Cron
字段一无所知的结构时,这才有效。
与this example中一样。