【问题标题】:How can I make a function map when functions have a receiver argument? [duplicate]当函数具有接收器参数时,如何制作函数映射? [复制]
【发布时间】:2020-06-22 01:10:04
【问题描述】:

我已经能够为没有接收器参数的方法制作函数映射。这是一个例子。

var funcMap = map[string]func() bool {
    "&" : And,
}

func And() bool {
    return true && false
}

但是,如果我的函数有一个接收器参数,我如何将它添加到函数映射中?下面的代码不起作用,但试图显示我想要做什么。

type Operand struct {
    Operator string
    Arg1 interface{}
    Arg2 interface{}
}

var funcMap = map[string]Operand.func() bool {
    "&" : Operand.And,
}

func (o *Operand) And() bool {
    return argToBool(o.Arg1) && argToBool(o.Arg2)
}

【问题讨论】:

  • @super 我相信这个问题问的问题与我想做的有点不同。我可以使用的一种选择是使用链接问题的答案中提供的反射。但是我认为我的问题有所不同,kashyap-kn 提供的答案是此用例的更好解决方案。
  • 我会说这只是一个偏好问题。要么你有一个签名func(Operand*) bool 的函数,你可以把它包装在一个接口中,或者你有一个接口,它包装了一个工作函数和两个参数。最后,它们基本上是一样的。
  • 欺骗的优点是它展示了 2 种惯用的 golang 方法来将函数与接收器绑定。隐式绑定或转换为以接收者为第一个参数的函数。语言核心功能都支持两者。

标签: go


【解决方案1】:

我们可以创建一个带有函数及其参数的结构体,而不是使用函数创建映射

// Create a function type which takes desired params and return type
type myFunc func(interface{}, interface{})(bool) // Assuming return type as bool

// Create a struct
type workerStruct struct {
     WorkFunc   myFunc
     Arg1       interface{}
     Arg2       interface{}
}

使用上面带有函数和参数的结构作为映射的值

funcMap := map[string]workerStruct{}

myStruct := workerStruct {
    WorkFunc : Operand,           // This would your input function
    Arg1     : myarg1,
    Arg2     : myarg2,
}

funcMap["&"] = myStruct

希望对你有帮助

【讨论】:

    【解决方案2】:

    你只需要初始化你的结构:

    o := Operand{
        Arg1: false,
        Arg2: true,
    }
    
    var funcMap = map[string]func() bool {
        "&" : o.And,
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 2021-11-23
      • 2020-11-20
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      相关资源
      最近更新 更多