我知道可以为特定类型创建方法
示例
type MyFunc func() int
func (f MyFunc) eval() int {
return f()
}
func main() {
var randomFunction MyFunc = func() int {
return 1;
}
fmt.Println(randomFunction.eval()) // prints 1
}
但是randomFunction
必须声明为MyFunc
类型。如果声明看起来像
randomFunction := func() int {
return 1;
}
该方法调用无效。
我的问题是,例如是否可以为每个具有func () int
类型的函数创建方法。
我知道Go不起作用,也不包含太多函数成语,但是我正在寻找一种类似于Haskell的show实例的函数:
instance Show (Int -> Int) where
show op = show "Function with 1 Int param and Int return type"
答案 0 :(得分:3)
方法与类型“绑定”。 MyFunc.eval()
绑定为类型MyFunc
。
此:
randomFunction := func() int {
return 1
}
是一个short variable declaration,它创建一个名称为randomFunction
的变量,并使用函数文字为其提供初始值,其类型将为匿名函数类型:func() int
。此类型不具有eval()
函数(匿名类型具有零个方法)。
但是您可以使用类型conversion将其转换为MyFunc
,结果值将具有该方法:
randomFunction2 := func() int {
return 1
}
fmt.Println(MyFunc(randomFunction2).eval()) // prints 1
上面的转换当然不会改变randomFucntion2
的类型。
如果在短变量声明中使用转换,则randomFunction3
的静态类型为MyFunc
,而“始终”的静态类型为eval()
:
randomFunction3 := MyFunc(func() int {
return 1
})
fmt.Println(randomFunction3.eval()) // prints 1
还请注意,通常您甚至不必手动转换函数值,就好像它是匿名类型一样,转换也会自动发生。
例如,如果您有一个函数,其值的类型为MyFunc
:
func handle(f MyFunc) {
fmt.Println(f.eval())
}
您可以将上面的randomFunction2
传递给它:
handle(randomFunction2) // This is OK
以上方法之所以有效,是因为randomFunction2
的值是assignable类型的MyFunc
(具有相同的基本类型)的变量。有关详细信息,请参见Custom type passed to function as a parameter。
在Go Playground上尝试示例。