登录
首页 >  Golang >  Go问答

传递结构体方法作为参数

来源:stackoverflow

时间:2024-02-15 21:24:24 259浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《传递结构体方法作为参数》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

我不确定我是否试图超出 go 允许的限制,但上下文如下: 我有一个名为 map 的类型,其中包含大量有用的成员函数,例如 interpolateaddclear。我还有一个结构类型 layered,其中包含多个 map

type map [][]float64

func (m map) interpolate(min, max float64) { ... }
func (m map) add(val float64) { ... }
func (m map) clear() { ... }

type layered struct {
    data []map
}

我想向 layered 添加一个成员函数,该函数接受 map 的任何成员函数作为参数,然后在其包含的所有 map 上调用它。大致如下:

func (l layered) mapcall(callme func(map)) {
    for _, m := range l.data {
        callme(m)
    }
}

这部分有效,但仅适用于不带附加参数的 map 成员函数,例如 clear。是否可以接受 map 的任何成员函数作为参数(以及 ...interface{} 形式的潜在参数),然后调用该函数layered 中的所有成员 maps 的参数是否正确?例如这样的事情:

func (l Layered) MapCall(callMe func(Map, ...interface{}), params ...interface{}) {
    for _, m := range l.data {
        callMe(m, params...)
    }
}

解决方案


您可能想要比尝试使用界面更实用。

我将提供一个使用您的 interpolate 方法的示例。

您可以首先定义一个用于生成操作的辅助函数:

func interpolateop(min, max float64) func(map) {
    return func(m map) {
        m.interpolate(min, max)
    }
}

与您的 mapcall 函数更匹配的另一个名称是 mapinterpolate

然后,当使用 mapcall 或创建操作列表时,您可以使用之前使用的相同类型,即 func(map)

var l Layered
...
l.MapCall(InterpolateOp(2, 4))

这个解决方案的关键是将数据绑定到构成函数的闭包上,这解决了最初的问题:没有足够的数据来调用相应的函数。

就您而言,如果有太多方法不值得这样做,那么您可能会考虑代码生成,因为它是重复且简单的。这超出了这个问题的范围。

另请参阅:https://dave.cheney.net/2016/11/13/do-not-fear-first-class-functions

今天关于《传递结构体方法作为参数》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>