Go有lambda表达式或类似的东西吗?

loy*_*low 66 lambda go

Go支持lambda表达式或类似的东西吗?

我想从另一种使用lambda表达式(Ruby)的语言中移植一个库.

per*_*eal 60

这是一个例子,仔细复制和粘贴:

package main

import fmt "fmt"

type Stringy func() string

func foo() string{
  return "Stringy function"
}

func takesAFunction(foo Stringy){
  fmt.Printf("takesAFunction: %v\n", foo())
}

func returnsAFunction()Stringy{
  return func()string{
    fmt.Printf("Inner stringy function\n");
    return "bar" // have to return a string to be stringy
  }
}

func main(){
  takesAFunction(foo);
  var f Stringy = returnsAFunction();
  f();
  var baz Stringy = func()string{
    return "anonymous stringy\n"
  };
  fmt.Printf(baz());
}
Run Code Online (Sandbox Code Playgroud)

  • 我希望看到你的问题比复制的代码更多.首先,您可以添加"是"/"否"/"部分"等等.然后进行一些描述,您的代码实际上做了什么. (22认同)
  • 你为什么这样说?仔细复制和粘贴?:) (10认同)
  • Kissaki基本上是将函数传递给其他函数并从函数返回函数,代码是自描述的,名称很聪明,takeaFunction接收函数而不是返回字符串,返回函数返回一个函数而不是返回一个字符串.....所以..是的......完全支持lambdas:D .... (2认同)
  • 一个非常好的例子是一个 lambda 函数的例子,它接受一个参数并在它声明的相同表达式中被调用。 (2认同)
  • 您的import语句中的`fmt“ fmt”`是多余的。 (2认同)

小智 35

Lambda表达式也称为函数文字.Go完全支持它们.

请参阅语言规范:http: //golang.org/ref/spec#Function_literals

查看代码行走,以及示例和说明:http: //golang.org/doc/codewalk/functions/

  • 这是最好的答案。我想补充一点,通过“lambdas”,人们通常会考虑像 `x -> x+1` 这样的短函数文字,但是 Go 不支持这种语法,所以你必须编写完整的 `func (x int) {返回 x+1 }`。 (15认同)

din*_*pal 14

在计算机编程中,匿名函数或lambda抽象(函数文字)是未绑定到标识符的函数定义,Go支持匿名函数,它们可以形成闭包.当您想要内联定义函数而不必命名它时,匿名函数很有用.

    package main
    import "fmt"

    func intSeq() func() int {
        i := 0
        return func() int {
            i += 1
            return i
        }
    }


    func main() {
       nextInt := intSeq()
       fmt.Println(nextInt())
       fmt.Println(nextInt())
       fmt.Println(nextInt())
       newInts := intSeq()
       fmt.Println(newInts())
    }
Run Code Online (Sandbox Code Playgroud)

function intSeq返回另一个函数,我们在intSeq的主体中匿名定义.该返回的函数在变量i关闭以形成一个闭合.

Output
$ go run closures.go
1
2
3
1
Run Code Online (Sandbox Code Playgroud)


小智 7

golang 好像没有做 lambda 表达式,但是你可以用一个字面量匿名函数,我在学习比较 JS 中的等价物的时候写了一些例子,希望对你有帮助!!

没有参数返回字符串:

func() string {
    return "some String Value"
}
//Js similar: () => 'some String Value'
Run Code Online (Sandbox Code Playgroud)

带字符串参数和返回字符串

func(arg string) string {
    return "some String" + arg
}
//Js similar: (arg) => "some String Value" + arg
Run Code Online (Sandbox Code Playgroud)

无参数且无返回(无效)

func() {
   fmt.Println("Some String Value")
} 
//Js similar: () => {console.log("Some String Value")}
Run Code Online (Sandbox Code Playgroud)

带参数且无返回(无效)

func(arg string) {
    fmt.Println("Some String " + arg)
}
//Js: (arg) => {console.log("Some String Value" + arg)}
Run Code Online (Sandbox Code Playgroud)

  • Go 支持匿名和高阶函数,因此它确实允许您“创建 lambda 表达式”。例如+1。 (2认同)