Go是否具有lambda表达式或类似内容?


77

Go是否支持lambda表达式或类似内容?

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

Answers:


70

这是一个示例,请仔细复制并粘贴:

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

28
除了复制代码,我希望看到更多有关您的问题的信息。首先,您可以添加“是” /“否” /“部分”等。然后是一些描述,您的代码实际上是做什么的。
Kissaki

2
Kissaki基本上是将函数传递给其他函数并从函数返回函数,代码具有自描述性,并且名称很聪明,takesaFunction接收函数而不是返回字符串,returnsAFunction返回函数而不是返回字符串... so ..是的...完美地支持lambdas:D ....
clagccs 2012年

2
这里有一个很好的例子是一个lambda函数的示例,该函数接受一个参数,并在与声明的表达式相同的位置进行调用。
全方位1998年

不幸的是,此示例令人困惑,因为它对一个函数(foo)使用相同的名称,而对另一个函数使用参数(foo Stringy)。我不应该被如此仔细地抄袭:)
SeB.Fr

任何拒绝执行baz的方式:= func()string {返回“匿名字符串\ n”}
保罗·米勒


16

在计算机编程中,匿名函数或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())
    }

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

Output
$ go run closures.go
1
2
3
1

4

golang似乎不做lambda表达式,但是您可以使用文字匿名函数,我在研究JS中的等效项时写了一些示例,希望对您有所帮助!

没有参数返回字符串:

func() string {
    return "some String Value"
}
//Js similar: () => 'some String Value'

与字符串args并返回字符串

func(arg string) string {
    return "some String" + arg
}
//Js similar: (arg) => "some String Value" + arg

没有参数也没有回报(无效)

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

有参数且无回报(无效)

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

好的答案,只是缺少自动运行的示例()
Hasan A Yousef

Go支持匿名和高阶函数,因此可以“制作lambda表达式”。例如+1。
汤姆L

1

我一直在寻找的尚未提供的示例是将值直接从匿名函数分配给变量,例如

test1, test2 := func() (string, string) {
    x := []string{"hello", "world"}
    return x[0], x[1]
}()

注意:您需要()在函数末尾使用方括号来执行它并返回值,否则仅返回函数并产生assignment mismatch: 2 variable but 1 values错误。


-4

是的,因为它是一种功能齐全的语言,但是没有通常的lambda符号使用粗箭头(=>)或细箭头(->),并且为了清晰和简单起见,使用func关键字。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.