Does Go have lambda expressions or anything similar?

GoLambda

Go Problem Overview


Does Go support lambda expressions or anything similar?

I want to port a library from another language that uses lambda expressions (Ruby).

Go Solutions


Solution 1 - Go

Yes.

Here is an example, copied and pasted carefully:

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

Solution 2 - Go

Lambda expressions are also called function literals. Go supports them completely.

See the language spec: http://golang.org/ref/spec#Function_literals

See a code-walk, with examples and a description: http://golang.org/doc/codewalk/functions/

Solution 3 - Go

> Yes

In computer programming, an anonymous function or lambda abstraction (function literal) is a function definition that is not bound to an identifier, and Go supports anonymous functions, which can form closures. Anonymous functions are useful when you want to define a function inline without having to name it.

    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 returns another function, which we define anonymously in the body of intSeq. The returned function closes over the variable i to form a closure.

Output
$ go run closures.go
1
2
3
1

Solution 4 - Go

The golang does not seem to make lambda expressions, but you can use a literal anonymous function, I wrote some examples when I was studying comparing the equivalent in JS, I hope it helps !!

no args return string:
func() string {
    return "some String Value"
}
//Js similar: () => 'some String Value'
with string args and return string
func(arg string) string {
    return "some String" + arg
}
//Js similar: (arg) => "some String Value" + arg
no arguments and no returns (void)
func() {
   fmt.Println("Some String Value")
} 
//Js similar: () => {console.log("Some String Value")}
with Arguments and no returns (void)
func(arg string) {
    fmt.Println("Some String " + arg)
}
//Js: (arg) => {console.log("Some String Value" + arg)}

Solution 5 - Go

An example that hasn't been provided yet that I was looking for is to assign values directly to variable/s from an anonymous function e.g.

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

Note: you require brackets () at the end of the function to execute it and return the values otherwise only the function is returned and produces an assignment mismatch: 2 variable but 1 values error.

Solution 6 - Go

Here is a 'curried function' example. However the syntax seems unclear, relative to the lambda function syntax in other languages such as Swift, C#, etc.

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

Solution 7 - Go

Yes, since it is a fully functional language, but has no fat arrow (=>) or thin arrow (->) as the usual lambda sign, and uses the func keyword for the sake of clarity and simplicity.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionloyalflowView Question on Stackoverflow
Solution 1 - GoperrealView Answer on Stackoverflow
Solution 2 - GoTim FordView Answer on Stackoverflow
Solution 3 - Godinesh kandpalView Answer on Stackoverflow
Solution 4 - GoNotim_View Answer on Stackoverflow
Solution 5 - GoJames BurkeView Answer on Stackoverflow
Solution 6 - GoKevin LanoView Answer on Stackoverflow
Solution 7 - GoLEMUEL ADANEView Answer on Stackoverflow