Подтвердить что ты не робот

Есть ли в Go лямбда-выражения или что-то подобное?

Go поддерживает лямбда-выражения или что-то подобное?

Я хочу портировать библиотеку с другого языка, который использует лямбда-выражения (Ruby).

4b9b3361

Ответ 1

Вот пример, тщательно скопированный и вставленный:

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

Ответ 3

Да

В компьютерном программировании анонимная функция или абстракция лямбда (функциональный литерал) - это определение функции, которое не связано с идентификатором, а 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

Ответ 4

Голанг, кажется, не создает лямбда-выражений, но вы можете использовать буквальную анонимную функцию, я написал несколько примеров, когда изучал сравнение эквивалента в 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)}

Ответ 5

Вот пример, который я искал - как передать анонимную функцию напрямую в качестве обратного вызова другой функции.

Предположим, что у нас есть функция filter которая принимает значение типа slice типа int и обратный вызов, который служит функцией предиката для фильтрации значений (возвращаются значения, которые проходят проверку предиката)

func filter(xi []int, predicate func(v int) bool) []int {
    filtered := []int{}

    for _, x := range xi {
        if predicate(x) {
            filtered = append(filtered, x)
        }
    }

    return filtered
}

Теперь, если у нас есть некоторая часть целых чисел [1, 2, 3, 4] и мы хотим получить только четное значение, мы можем заранее определить функцию isEven с помощью сигнатуры func isEven(x int) bool и передать эту функцию в качестве второго аргумента функция filter но мы также можем встроить эту функцию таким образом

even := filter(xi, func(x int) bool { return x%2 == 0 })

Обратите внимание, что нам всегда нужно указывать типы аргументов функции, а также типы возвращаемых значений.

Просто для справки, приведенная выше строка кода эквивалентна

func isEven(x int) bool {
    return x%2 == 0
}

even := filter(xi, isEven)

Ответ 6

Пример, который еще не был предоставлен, который я искал, - это присвоение значений непосредственно переменной/с из анонимной функции, например

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

Примечание: вам требуется скобки () в конце функции для ее выполнения и возврата значений, в противном случае возвращается только функция и выдается ошибка assignment mismatch: 2 variable but 1 values.

Ответ 7

Да, но это лямбда-выражение в его самой полной форме, замыканиях и прочем. Однако вы не получите логический вывод типа с функциональными литералами! Это то, что делает Go отстой!

Ответ 8

Да, поскольку он является полностью функциональным языком, но не имеет жирной стрелки (=>) или тонкой стрелки (->) в качестве обычного лямбда-знака и использует ключевое слово func для ясности и простоты.