Go支持lambda表达式或类似的东西吗?
我想从使用lambda表达式(Ruby)的另一种语言移植一个库。
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());
}
type
不是必需的。你可以直接声明func takesAFunction(foo func()string)
。 - Ferran Maylinchlambda表达式也被称为函数字面量。Go完全支持它们。
请参见语言规范: http://golang.org/ref/spec#Function_literals
观看代码演示,其中包括示例和描述: http://golang.org/doc/codewalk/functions/
x -> x+1
这样的短函数字面量,但是 Go 不支持这种语法,所以你必须编写完整的 func (x int) { return x+1 }
。 - Ferran Maylinch是的
在计算机编程中,匿名函数或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())
}
函数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)}
()
的示例。 - Hasan A Youseftest1, test2 := func() (string, string) {
x := []string{"hello", "world"}
return x[0], x[1]
}()
()
来执行它并返回其值,否则只会返回函数本身并导致assignment mismatch: 2 variable but 1 values
错误。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符号那样的fat arrow(=>)或thin arrow(->),而是为了清晰和简单起见使用func关键字。
x -> x+1
这样的短函数字面量(short function literals)。 - Ferran Maylinch