98

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

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

4

7 回答 7

85

是的。

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

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());
}
于 2012-08-01T19:44:05.463 回答
51

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

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

查看代码步行,带有示例和描述: http: //golang.org/doc/codewalk/functions/

于 2012-08-02T17:35:25.673 回答
20

是的

在计算机编程中,匿名函数或 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
于 2017-07-21T06:38:55.687 回答
8

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

没有参数返回字符串:

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

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

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

没有参数也没有回报(void)

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)}
于 2019-01-13T16:40:30.547 回答
1

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

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

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

于 2019-08-23T11:52:16.533 回答
1

这是一个“咖喱函数”示例。然而,相对于 Swift、C# 等其他语言中的 lambda 函数语法,语法似乎不清楚。

func main() int { 
  var f func(string) func(string) int
  f = func(_x1 string) func(string) int { return func(_x2 string) int { return strings.Compare(_x1,_x2) } }
  return ((f)("b"))("a")
}
于 2022-01-16T16:15:49.583 回答
-3

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

于 2018-08-05T01:24:02.747 回答