在 golang 中同一结构中的 func 中引用另一个字段



我有一个结构看起来像这样:

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字段时,这才有效。
如本例所示。

最新更新