在 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 ] .
不允许使用函数类型(而不是签名)。
所以不,你想要的东西是不可能的。其原因是因为签名(函数类型)不包含参数名称(仅包含它们的顺序和类型),但是当您实际“创建”函数值时,您需要一种引用它们的方法,并且只有函数类型,没有参数名称。
倚天杖
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
- 2 回答
- 0 关注
- 142 浏览
添加回答
举报
0/150
提交
取消