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

时间:2014-12-25 10:37:15

标签: struct go

我的结构看起来像这样:

type Job struct {
    Action  func()
    Cron    string
}

因此,对于此结构的实例,Action实现中的代码是否可以获得对Cron的引用?感谢。

2 个答案:

答案 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)

您似乎必须传递JobAction函数的引用,才能让所述函数访问Cron

See for instance

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中一样。