猿问

在 Golang 中使用类型别名声明函数

在 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)

}

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


上面的代码示例(我希望它与下面的代码示例相同(将 line 替换(1)为 line (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)

}


临摹微笑
浏览 144回答 2
2回答

阿波罗的战车

来自规范:函数文字:FunctionLit = "func" Signature FunctionBody .函数文字必须包含func关键字和Signature。语法不允许使用函数类型。函数声明也是如此:FunctionDecl = "func" FunctionName Signature [ FunctionBody ] .不允许使用函数类型(而不是签名)。所以不,你想要的东西是不可能的。其原因是因为签名(函数类型)不包含参数名称(仅包含它们的顺序和类型),但是当您实际“创建”函数值时,您需要一种引用它们的方法,并且只有函数类型,没有参数名称。

倚天杖

不,但在 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
随时随地看视频慕课网APP

相关分类

Go
我要回答