Анонимные функции в Golang

Пользователь

Сам раньше с ними не сталкивался. Вот знакомый сказал, что они существуют в Golang. Теперь хочу о них узнать. Расскажите о них, или приведите примеры. Буду рад ответам.

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket
1 июня 2020 г., 19:18

Пользователь

Эти функции не имеющие назначенного имени. Они могут определяться в других функциях и могут иметь доступ к контексту выполнения. 

1 июня 2020 г., 19:24

Пользователь

Если вам нужно выполнить сложение двух чисел и больше это действие, в программе не нужно. Приведу пример кода:

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
}

Можно проверить в https://play.golang.org

Ответ:

7

13

1 июня 2020 г., 19:30

Пользователь

Поделюсь большим и более сложным примером.

package main

import (
	"fmt"
)

func altera(a int) {
	a = 2
	fmt.Println(a)
}

func main() {
	a := 1
	fmt.Println(a) // по умолчанию 1

	// передается в именованную функцию 
	altera(a)   // изменено на 2 
	fmt.Println(a) // снова 1

	// Анонимная функция без передачи
	func() {
		a = 3
		fmt.Println(a) // изменено на 3
	}()
	fmt.Println(a) // осталось 3 !!!

	// передается анонимной функции
	func(a int) {
		a = 4
		fmt.Println(a) // изменено на 4
	}(a)
	fmt.Println(a) // снова 3 
}
1 июня 2020 г., 19:39

Пользователь

Они могут быть как аргумент. Они удобно используются в этом качестве.

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
}
1 июня 2020 г., 19:45

Пользователь

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

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
}
1 июня 2020 г., 20:01

Пользователь

Забыл упомянуть об их преимуществе. У них есть доступ к окружению, в котором они вызываются.

Пример

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
}
1 июня 2020 г., 20:23