Does Go have lambda expressions or anything similar?

前端 未结 6 1750
青春惊慌失措
青春惊慌失措 2020-12-08 03:36

Does Go support lambda expressions or anything similar?

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

相关标签:
6条回答
  • 2020-12-08 04:07

    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)}
    
    0 讨论(0)
  • 2020-12-08 04:09

    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
    
    0 讨论(0)
  • 2020-12-08 04:10

    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.

    0 讨论(0)
  • 2020-12-08 04:13

    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.

    0 讨论(0)
  • 2020-12-08 04:15

    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());
    }
    
    0 讨论(0)
  • 2020-12-08 04:34

    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/

    0 讨论(0)
提交回复
热议问题