Function 在Golang中声明类型别名为的函数

Function 在Golang中声明类型别名为的函数,function,go,type-alias,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) } 换句话说,是否可以使用函数类型别名声明

在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)
行),导致编译错误
语法错误:意外返回,需要表达式

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

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

同样的道理也适用于

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

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

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


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

这没关系,myFun必须包含func关键字,这意味着它是myFunType的func类型,参数和返回类型必须与声明的myFunType相同。

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

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

ErrFileNotFound:=func(文件字符串)错误{返回错误.New(fmt.Sprintf(“未找到文件%v”,文件))}
这个函数可以在文件中多次使用,比如

file,err:=os.Open(filenameRequestedToOpen)//用于读取访问。
如果出错!=零{
log.Fatal(ErrFileNotFound(filenameRequestedToOpen))
}

或者从另一个角度看

这一点:如果您有一系列函数都使用相同的签名运行,并且您担心必须反复输入,也许是时候将它封装到一个结构中,并编写接受该结构作为接收器的方法了?你的意思是将函数的参数封装到一个结构中?是的,这将是一个有效的替代方案。即使你的答案是正确的,正确地表达它始终是一个好主意:),比如,对它进行更多的硼化并格式化代码部分。好吧,我知道这是正确的,但它对我没有帮助,因为我不想重复函数的签名。也就是说,问题是如何实现
(1)
。myFunType包含func(x int)和return(int),因此,var myFun myFunType=myFunType{return x}意味着func(x int){return x}{return x},我想=
FunctionLit = "func" Signature FunctionBody .
FunctionDecl = "func" FunctionName Signature [ FunctionBody ] .