Go поддерживает лямбда-выражения или что-то подобное?
Я хочу портировать библиотеку с другого языка, который использует лямбда-выражения (Ruby).
Go поддерживает лямбда-выражения или что-то подобное?
Я хочу портировать библиотеку с другого языка, который использует лямбда-выражения (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()); }
Лямбда-выражения также называются функциональными литералами. Go поддерживает их полностью.
См. спецификацию языка: http://golang.org/ref/spec#Function_literals
См. кодовую прогулку с примерами и описанием: http://golang.org/doc/codewalk/functions/
Да
В компьютерном программировании анонимная функция или абстракция лямбда (функциональный литерал) - это определение функции, которое не связано с идентификатором, а 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
Голанг, кажется, не создает лямбда-выражений, но вы можете использовать буквальную анонимную функцию, я написал несколько примеров, когда изучал сравнение эквивалента в 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)}
Вот пример, который я искал - как передать анонимную функцию напрямую в качестве обратного вызова другой функции.
Предположим, что у нас есть функция 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)
Пример, который еще не был предоставлен, который я искал, - это присвоение значений непосредственно переменной/с из анонимной функции, например
test1, test2 := func() (string, string) {
x := []string{"hello", "world"}
return x[0], x[1]
}()
Примечание: вам требуется скобки ()
в конце функции для ее выполнения и возврата значений, в противном случае возвращается только функция и выдается ошибка assignment mismatch: 2 variable but 1 values
.
Да, но это лямбда-выражение в его самой полной форме, замыканиях и прочем. Однако вы не получите логический вывод типа с функциональными литералами! Это то, что делает Go отстой!
Да, поскольку он является полностью функциональным языком, но не имеет жирной стрелки (=>) или тонкой стрелки (->) в качестве обычного лямбда-знака и использует ключевое слово func для ясности и простоты.