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

时间:2012-08-01 19:37:20

标签: go lambda

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

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

8 个答案:

答案 0 :(得分:50)

Here is an example,仔细复制并粘贴:

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

答案 1 :(得分:30)

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

查看语言规范: http://golang.org/ref/spec#Function_literals

通过示例和说明查看代码遍历: http://golang.org/doc/codewalk/functions/

答案 2 :(得分:9)

  

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

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

Output
$ go run closures.go
1
2
3
1

答案 3 :(得分:2)

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

答案 4 :(得分:0)

是的,但是它是lambda表达式的最完整形式,包括闭包和所有形式。但是,您不会使用函数文字获得类型推断! 这就是让Go糟透了的原因!

答案 5 :(得分:0)

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

答案 6 :(得分:0)

这是我一直在寻找的示例-如何直接将匿名函数作为回调传递给另一个函数

假设我们有一个filter函数,该函数采用一个int切片类型的值,并充当一个用作谓词函数以过滤值的回调(返回通过谓词检查的值)

func filter(xi []int, predicate func(v int) bool) []int {
    filtered := []int{}

    for _, x := range xi {
        if predicate(x) {
            filtered = append(filtered, x)
        }
    }

    return filtered
}

现在,如果我们有一些整数[1, 2, 3, 4]且只想获得偶数,那么我们可以预先用签名isEven定义func isEven(x int) bool函数,并将此函数作为第二个参数传递给filter函数,但我们也可以通过这种方式内联

even := filter(xi, func(x int) bool { return x%2 == 0 })

请注意,我们始终需要指定函数参数的类型以及返回值的类型。

仅供参考,上面的代码行等效于

func isEven(x int) bool {
    return x%2 == 0
}

even := filter(xi, isEven)

答案 7 :(得分:0)

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

C:\MyDirectory\SubDir>

注意:您需要在函数末尾使用括号echo来执行并返回值,否则仅返回函数并产生test1, test2 := func() (string, string) { x := []string{"hello", "world"} return x[0], x[1] }() 错误。