Go语言支持lambda表达式或者类似的东西吗?我想从另一种使用lambda表达式的语言(Ruby)移植一个库。
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()); }
mzsu5hc02#
Lambda表达式也被称为函数常量,Go语言完全支持它们。参见语言规范:http://golang.org/ref/spec#Function_literals请参阅代码审核,其中包含示例和说明:http://golang.org/doc/codewalk/functions/
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
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
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)}
dtcbnfnu5#
一个还没有提供的例子,我正在寻找的是从一个匿名函数直接赋值给变量。
test1, test2 := func() (string, string) { x := []string{"hello", "world"} return x[0], x[1] }()
注意:您需要在函数的末尾加上括号()来执行它并返回值,否则只返回函数并产生assignment mismatch: 2 variable but 1 values错误。
()
assignment mismatch: 2 variable but 1 values
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") }
vc6uscn97#
是的,因为它是一种全函数语言,但是没有常用的lambda符号粗箭头(=〉)或细箭头(-〉),并且为了清晰和简单起见使用了func关键字。
7条答案
按热度按时间fhity93d1#
是的。
Here is an example,仔细复制粘贴:
mzsu5hc02#
Lambda表达式也被称为函数常量,Go语言完全支持它们。
参见语言规范:http://golang.org/ref/spec#Function_literals
请参阅代码审核,其中包含示例和说明:http://golang.org/doc/codewalk/functions/
flmtquvp3#
是的
在计算机编程中,**匿名函数(anonymous function)或lambda抽象(lambda abstraction)(function literal)是一个不绑定标识符的函数定义,Go语言支持匿名函数,它可以形成闭包。匿名函数在你想要内联定义一个函数而不需要给它命名时非常有用。
函数intSeq返回另一个函数,我们在intSeq的函数体中匿名定义了这个函数。返回的函数关闭变量i,形成闭包。
p4tfgftt4#
golang似乎不做lambda表达式,但你可以使用一个文字匿名函数,我写了一些例子,当我学习比较JS中的等价物!
无参数返回字符串:
带有字符串参数并返回字符串
无参数且无返回值(void)
带参数且不返回(void)
dtcbnfnu5#
一个还没有提供的例子,我正在寻找的是从一个匿名函数直接赋值给变量。
注意:您需要在函数的末尾加上括号
()
来执行它并返回值,否则只返回函数并产生assignment mismatch: 2 variable but 1 values
错误。rslzwgfq6#
这是一个“curried函数”的例子,但是相对于其他语言如Swift、C#等中的lambda函数语法,它的语法看起来不太清楚。
vc6uscn97#
是的,因为它是一种全函数语言,但是没有常用的lambda符号粗箭头(=〉)或细箭头(-〉),并且为了清晰和简单起见使用了func关键字。