【问题标题】:variable containing struct method包含结构方法的变量
【发布时间】:2015-12-29 18:04:43
【问题描述】:

给定结构:

type A struct {
    total int
}

和函数

(a *A) add func (i int, j int) (int x) {
    a.total += i+j
    return i+j
  }

我想创建一个指向函数的变量并通过该变量调用它。我在为包含结构实例的变量定义签名时遇到问题。

为什么要这样做?因为我想创建一个 func 指针数组并遍历它,所以它按顺序调用它们。使用我的 func 构建块,我可以拥有不同的数组来完成不同的任务。

这两个不编译:

thisfunc func (a *A) (i int, b int) (x int)
thisfunc (a *A) func (i int, b int) (x int)

这个编译但不包括结构实例,当调用 thisfunc 时,缺少一个 - 没有结构实例,即空指针取消引用。

thisfunc func (i int, b int) (x int)

我想做这样的事情:

thisfunc = a.add
b := thisfunc(1,2)

请帮我定义一个变量 thisfunc 其签名匹配 a.add。

【问题讨论】:

  • 这不是不可能的,但它可能是不必要的复杂。 thisfunc 不能是一个接受结构指针的函数,而不是一个接收器是该结构指针的方法,是否有原因?例如func thisfunc(a *A, i, j int)
  • 这确实是我所做的。容易得多。知道签名是什么可能很好,但继续生活更重要

标签: go


【解决方案1】:

我想你要找的是"Method Values"

给定类型A

type A struct {
    total int
}

func (a *A) add(i int, j int) int {
    a.total += i + j
    return i + j
}

虽然method expression(*A).add 在技术上具有签名

func(*A, int, int)

您可以将add 方法的值用作带有签名的函数

func(int int)

可以这样分配:

var thisfunc func(int, int) int

a := A{}
thisfunc = a.add
thisfunc(3, 4)

http://play.golang.org/p/_3WztPbL__

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 2016-03-06
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多