可以为函数类型创建方法吗?

时间:2019-07-04 13:40:00

标签: function go methods

我知道可以为特定类型创建方法

示例

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"

1 个答案:

答案 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上尝试示例。