在Golang中声明带有类型别名的函数

时间:2019-07-19 08:20:53

标签: function go type-alias

在Golang中可以做这样的事情吗?

package main

import "fmt"

type myFunType func(x int) int

var myFun myFunType = myFunType { return x }  // (1) 

func doSomething(f myFunType) {
    fmt.Println(f(10))
}

func main() {
    doSomething(myFun)
}

换句话说,是否可以使用函数类型别名来声明函数类型变量,而无需重复签名? 或者,或者,是否有一种方法在创建函数类型的变量时不总是重新键入整个函数签名

上面的代码示例与下面的示例相同(用行(1)替换行(2)),会导致编译错误syntax error: unexpected return, expecting expression

package main

import "fmt"

type myFunType func(x int) int 

var myFun myFunType = func(x int) int { return 2 * x } // (2)

func doSomething(f myFunType) {
    fmt.Println(f(10))
}

func main() {
    doSomething(myFun)
}

3 个答案:

答案 0 :(得分:3)

来自Spec: Function literals:

FunctionLit = "func" Signature FunctionBody .

函数文字必须包含func关键字和Signature。语法不允许使用函数类型。

Function declarations:相同

FunctionDecl = "func" FunctionName Signature [ FunctionBody ] .

不允许使用函数类型(而不是签名)。

所以不,您想要的是不可能的。其原因是因为签名(函数类型)不包括参数名称(只是它们的顺序和类型),但是当您实际上在“创建”函数值时,您需要一种引用它们的方法,并且仅具有函数类型,而没有参数名称。

有关更多信息,请参阅相关问题:

Getting method parameter names in Golang

Is unnamed arguments a thing in Go?

答案 1 :(得分:0)

var myFun myFunType = func(x int) int { return 2 * x } // (2) 没关系,myFun必须包含func关键字,表示它是myFunType的func类型,并且参数和返回类型必须与声明的myFunType相同。

答案 2 :(得分:0)

否,但是在golang中,您可以使用名称定义方法并使用它们。

作为一个例子。有时,在文件的顶部甚至整个软件包中,都有一种常见的错误定义方式,如下所示:

ErrFileNotFound := func(file string) error { return errors.New(fmt.Sprintf("file not found %v", file))  }

然后该功能可以在文件中多次使用,例如

file, err := os.Open(filenameRequestedToOpen) // For read access.
if err != nil {
  log.Fatal(ErrFileNotFound(filenameRequestedToOpen))
}

或参见https://play.golang.org/p/CvBGGc3YeX4