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

Posted

技术标签:

【中文标题】Go 有 lambda 表达式或类似的东西吗?【英文标题】:Does Go have lambda expressions or anything similar? 【发布时间】:2012-07-30 18:24:00 【问题描述】:

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

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

【问题讨论】:

Go 有 anonymous functions,但没有像 x -> x+1 这样的短函数字面量。 【参考方案1】:

是的。

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

【讨论】:

我希望看到更多关于您的问题的信息,而不是复制的代码。首先,您可以添加“是”/“否”/“部分”等。然后是一些描述,您的代码实际上做了什么。 Kissaki 基本上他是将函数传递给其他函数并从函数返回函数,代码是自我描述的,名称很聪明,takeaFunction 接收函数而不是返回字符串,returnsAFunction 返回函数而不是返回字符串.....所以..是的...完美支持 lambdas :D .... 一个非常好的例子是一个 lambda 函数的例子,它接受一个参数并在它声明的同一表达式中调用。 不幸的是,这个例子令人困惑,因为它对一个函数 (foo) 和另一个函数的参数 (foo Stringy) 使用相同的名称。我不应该被如此仔细地复制:) 任何不做的事情 baz := func()string return "anonymous stringy\n" 【参考方案2】:

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

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

查看包含示例和说明的代码漫游: http://golang.org/doc/codewalk/functions/

【讨论】:

这是最好的答案。我想通过“lambdas”补充一点,人们通常会考虑像 x -> x+1 这样的短函数文字,但 Go 不支持这种语法,所以你必须编写完整的 func (x int) return x+1 【参考方案3】:

是的

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

【讨论】:

【参考方案4】:

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

带参数且不返回 (void)

func(arg string) 
    fmt.Println("Some String " + arg)

//Js: (arg) => console.log("Some String Value" + arg)

【讨论】:

很好的答案,只是缺少自动运行的示例() Go 支持匿名和高阶函数,因此它确实让你“制作 lambda 表达式”。 + 1 例如。【参考方案5】:

我正在寻找的一个尚未提供的示例是从匿名函数直接为变量赋值,例如

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

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

【讨论】:

【参考方案6】:

这是一个“柯里化函数”示例。但是,相对于 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")

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于Go 有 lambda 表达式或类似的东西吗?的主要内容,如果未能解决你的问题,请参考以下文章

C# Lambda表达式

Lambda 表达式常用语法

Expression.Call 在简单的 lambda 表达式中。可能吗?

Lambda表达式树构建(上)

C#005.Lambda表达式

C#005.Lambda表达式