为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
临摹微笑 2023-07-04 17:12:44
在 Golang 中可以做这样的事情吗?package mainimport "fmt"type myFunType func(x int) intvar 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 mainimport "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)}
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

来自规范:函数文字:

FunctionLit = "func" Signature FunctionBody .

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

函数声明也是如此:

FunctionDecl = "func" FunctionName Signature [ FunctionBody ] .

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

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



查看完整回答
反对 回复 2023-07-04
?
倚天杖

TA贡献1828条经验 获得超3个赞

不,但在 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


查看完整回答
反对 回复 2023-07-04
  • 2 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信