Go 将结构方法作为参数传递
我不确定我是否试图超出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的任何成员函
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
函数对我来说很有意义。一旦我完成了,实际使用这些函数也会少很多痛苦。我真的很感激你的帮助;再次感谢。