Go 将结构方法作为参数传递

Go 将结构方法作为参数传递,go,reflection,Go,Reflection,我不确定我是否试图超出Go允许的范围,但以下是上下文: 我有一个名为Map的类型,其中包含大量有用的成员函数,例如Interpolate、Add和Clear。我还有一个结构类型,Layered,它包含几个Maps 类型映射[][]64 func(m映射)插值(min,max float64){…} func(m映射)Add(val float64){…} func(m映射)Clear(){…} 类型分层结构{ 数据[]地图 } 我想向Layered添加一个成员函数,该函数接受Map的任何成员函

我不确定我是否试图超出Go允许的范围,但以下是上下文: 我有一个名为
Map
的类型,其中包含大量有用的成员函数,例如
Interpolate
Add
Clear
。我还有一个结构类型,
Layered
,它包含几个
Map
s

类型映射[][]64
func(m映射)插值(min,max float64){…}
func(m映射)Add(val float64){…}
func(m映射)Clear(){…}
类型分层结构{
数据[]地图
}
我想向
Layered
添加一个成员函数,该函数接受
Map
的任何成员函数作为参数,然后对其包含的所有
Map
调用它。大致如下:

func(l分层)映射调用(callMe func(Map)){
对于u,m:=范围l.数据{
callMe(m)
}
}
这部分起作用,但仅适用于不带额外参数的
Map
的成员函数,例如
Clear
。是否可以接受
Map
的任何成员函数作为参数(以及
..接口{}
形式的潜在参数),然后在
分层
中的所有成员
Map
上调用该函数及其正确参数?例如,类似这样的事情:

func(l分层)映射调用(callMe func(映射,…接口{}),params…接口{}){
对于u,m:=范围l.数据{
呼叫我(m,参数…)
}
}

您可能希望比尝试使用接口更实用

我将使用
插值
方法提供一个示例

您可以从定义用于生成操作的辅助函数开始:

func插值EOP(最小,最大浮点64)func(映射){
返回函数(m映射){
m、 插值(最小值、最大值)
}
}
另一个与
MapCall
函数更匹配的名称是
MapInterpolate

然后,在使用
MapCall
或创建操作列表时,可以使用以前使用的相同类型,即
func(Map)

var l分层
...
l、 地图调用(插值EOP(2,4))
此解决方案的关键是将数据绑定到构成函数的闭包,从而解决了原始问题:没有足够的数据来调用适当的函数

在您的例子中,如果有太多的方法不值得这样做,那么您可以研究代码生成,因为它是重复的和容易的。这超出了这个问题的范围


另请参见:

接口不会使复杂类型(如call me参数)具有多态性。这将只接受按字面意思接受参数类型
(Map,…interface{})
的函数。您可以将
callMe
的类型设置为
interface{}
,它将接受任何函数,但是您需要
reflect
来验证它,并调用itRemember Go,它是静态类型的,接口仍然是具体的类型(一个包含类型信息和指向实际数据的指针的结构)。只是当使用另一个值作为接口值时,Go会自动将原始值装箱到接口值中。更惯用的Go解决方案可能是1。不要使用
分层的
结构,只需直接使用
[]映射
值,并在调用站点使用
for range
循环,而不要使用helper函数。或2。同样,为
分层
类型复制所有相关的
映射
方法,每个方法只是范围
的一个
循环,在每个
映射
上调用相应的方法并传递参数。@HymnsForDisco谢谢!我刚刚开始尝试用一个很长的switch类型语句来实现它,但是你所说的复制所有相关的
Map
函数对我来说很有意义。一旦我完成了,实际使用这些函数也会少很多痛苦。我真的很感激你的帮助;再次感谢。