【问题标题】:Declare function with type alias in Golang在 Golang 中使用类型别名声明函数
【发布时间】:2019-07-19 08:20:53
【问题描述】:

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

【问题讨论】:

  • 从不同的角度解决这个问题:如果您有一系列功能都使用相同的签名,并且您担心必须一遍又一遍地输入,也许是时候封装它了进入一个结构并编写接受该结构作为接收者的方法?
  • 你的意思是把函数的参数封装成一个结构体?是的,那将是一个有效的替代方案。

标签: function go type-alias


【解决方案1】:

来自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?

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 即使你的答案是正确的,正确呈现它总是一个好主意:),比如详细说明它并格式化代码部分。
      • 嗯,我知道这是正确的,但这对我没有帮助,因为我想要的不是重复函数的签名。 IE。问题是如何实现(1)
      • myFunType 包含 func (x int) 和 return(int),所以,我认为 var myFun myFunType = myFunType { return x } 表示 func (x int) { return x} {return x}。 =..=
      猜你喜欢
      • 1970-01-01
      • 2017-06-16
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多