【发布时间】:2012-07-30 18:24:00
【问题描述】:
Go 是否支持 lambda 表达式或类似的东西?
我想从另一种使用 lambda 表达式 (Ruby) 的语言移植一个库。
【问题讨论】:
-
Go 有 anonymous functions,但没有像
x -> x+1这样的短函数字面量。
Go 是否支持 lambda 表达式或类似的东西?
我想从另一种使用 lambda 表达式 (Ruby) 的语言移植一个库。
【问题讨论】:
x -> x+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()); }
【讨论】:
Lambda 表达式也称为函数字面量。 Go 完全支持它们。
查看语言规范: http://golang.org/ref/spec#Function_literals
查看包含示例和说明的代码漫游: http://golang.org/doc/codewalk/functions/
【讨论】:
x -> x+1 这样的短函数文字,但 Go 不支持这种语法,所以你必须编写完整的 func (x int) { return x+1 }。
是的
在计算机编程中,匿名函数或 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
【讨论】:
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)}
【讨论】:
()
我正在寻找的一个尚未提供的示例是从匿名函数直接为变量赋值,例如
test1, test2 := func() (string, string) {
x := []string{"hello", "world"}
return x[0], x[1]
}()
注意:您需要在函数末尾加上括号 () 来执行它并返回值,否则只会返回函数并产生 assignment mismatch: 2 variable but 1 values 错误。
【讨论】:
这是一个“柯里化函数”示例。但是,相对于 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")
}
【讨论】:
是的,因为它是一种全功能语言,但没有粗箭头 (=>) 或细箭头 (->) 作为通常的 lambda 符号,因此使用 func 关键字清晰和简单。
【讨论】: