为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
ITMISS 2021-09-10 15:23:17
我有一个看起来像这样的结构:type Job struct {    Action  func()    Cron    string}那么对于这个结构体的一个实例,实现内部的代码是否有可能Action获得对 的引用Cron?谢谢。
查看完整描述

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()仍将指向原始实例(而不是副本)。


查看完整回答
反对 回复 2021-09-10
?
慕标5832272

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字段时,这才有效。

在这个例子中。


查看完整回答
反对 回复 2021-09-10
  • 2 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信