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

u7up0aaq  于 2023-03-10  发布在  Go
关注(0)|答案(7)|浏览(209)

Go语言支持lambda表达式或者类似的东西吗?
我想从另一种使用lambda表达式的语言(Ruby)移植一个库。

fhity93d

fhity93d1#

是的。
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());
}
mzsu5hc0

mzsu5hc02#

Lambda表达式也被称为函数常量,Go语言完全支持它们。
参见语言规范:http://golang.org/ref/spec#Function_literals
请参阅代码审核,其中包含示例和说明:http://golang.org/doc/codewalk/functions/

flmtquvp

flmtquvp3#

是的

在计算机编程中,**匿名函数(anonymous function)或lambda抽象(lambda abstraction)(function literal)是一个不绑定标识符的函数定义,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
p4tfgftt

p4tfgftt4#

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

dtcbnfnu5#

一个还没有提供的例子,我正在寻找的是从一个匿名函数直接赋值给变量。

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

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

rslzwgfq

rslzwgfq6#

这是一个“curried函数”的例子,但是相对于其他语言如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")
}
vc6uscn9

vc6uscn97#

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

相关问题