MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Funcții anonime

Funcțiile anonime sunt funcții căror nu le este atribuit un nume. Acestea se diferențiază de funcțiile obișnuite și prin faptul că pot fi definite în interiorul altor funcții și pot avea acces la contextul de execuție.

Funcțiile anonime ne permit să definim o anumită acțiune direct acolo unde este utilizată. De exemplu, să presupunem că trebuie să facem adunarea a două numere, dar această acțiune nu este necesară nicăieri altundeva în program:

package main
 
import "fmt"
 
func main() {
     
    f := func(x, y int) int{ return x + y}
    fmt.Println(f(3, 4))        // 7
    fmt.Println(f(6, 7))        // 13
}

De fapt, variabila f este definită astfel:

var f func(int, int) int = func(x, y int) int{ return x + y}

Adică, variabilei f îi poate fi atribuită orice funcție care corespunde tipului func(int, int) int.

Funcția anonimă ca argument al unei funcții

Este foarte convenabil să folosim funcțiile anonime ca argumente ale altor funcții:

package main
 
import "fmt"
 
func action(n1 int, n2 int, operation func(int, int) int){
 
    result := operation(n1, n2)
    fmt.Println(result)
}

func main() {
     
    action(10, 25, func (x int, y int) int { return x + y })    // 35
    action(5, 6, func (x int, y int) int { return x * y })      // 30
}

Funcția anonimă ca rezultat al unei funcții

O funcție anonimă poate fi și rezultatul unei alte funcții:

package main
 
import "fmt"
 
func selectFn(n int) (func(int, int) int){
    if n==1 {
        return func(x int, y int) int{ return x + y}
    }else if n==2{
        return func(x int, y int) int{ return x - y}
    }else{
        return func(x int, y int) int{ return x * y}
    }
}
 
func main() {
     
    f := selectFn(1)
    fmt.Println(f(2, 3))        // 5
    fmt.Println(f(4, 5))        // 9
    fmt.Println(f(7, 6))        // 13
}

Accesul la mediul înconjurător

Un avantaj al funcțiilor anonime este că ele au acces la mediul în care sunt definite. De exemplu:

package main
 
import "fmt"
 
func square() func() int { 
    var x int = 2
    return func() int { 
        x++
        return x * x
    }
}
 
func main() {
     
    f := square()
    fmt.Println(f())        // 9
    fmt.Println(f())        // 16
    fmt.Println(f())        // 25
}

Aici, funcția square definește o variabilă locală x și returnează o funcție anonimă. Funcția anonimă crește valoarea variabilei x și returnează pătratul acesteia.

Astfel, putem "captura" starea funcției externe square sub forma variabilei x, iar această stare va fi modificată în funcția anonimă.