lambda.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "unicode"
  7. )
  8. func main() {
  9. // ExampleFirstClassFunctionArgument()
  10. // ExamplrUseNoNameFunction()
  11. // ExampleClosure()
  12. foo1()
  13. }
  14. func invert(r rune) rune {
  15. if unicode.IsLower(r) {
  16. return unicode.ToUpper(r)
  17. }
  18. return unicode.ToLower(r)
  19. }
  20. func ExampleFirstClassFunctionArgument() {
  21. src := "aBcDeFg"
  22. test := "AbCdEfG"
  23. // 1. Передача ранее определенной функции
  24. // Применяем функцию invert к каждому символу строки src
  25. //src = strings.Map(invert, src)
  26. //fmt.Printf("Инвертированная строка: %s. Результат: %v.\n", src, src == test)
  27. // 2. Передача анонимной функции
  28. src = strings.Map(func(r rune) rune {
  29. if unicode.IsLower(r) {
  30. return unicode.ToUpper(r)
  31. }
  32. return unicode.ToLower(r)
  33. }, src)
  34. fmt.Printf("Инвертированная строка: %s. Результат: %v.\n", src, src == test)
  35. }
  36. func ExamplrUseNoNameFunction() {
  37. // Присваимваем переменной fn анонимную функцию
  38. fn := func(a, b int) int { return a + b }
  39. // Выполняем анонимную функцию прямо на месте
  40. func(a, b int) {
  41. fmt.Println(a + b)
  42. }(12, 34) // Вызов анонимной функции
  43. // Выполняем функцию
  44. fmt.Println(fn(17, 15))
  45. fmt.Printf("%T", fn)
  46. x := func(fn func(i int) int, i int) func(int) int { return fn }(func(i int) int { return i + 1 }, 5)
  47. fmt.Printf("%T", x)
  48. }
  49. // Более сложный пример замыкания
  50. func ExampleClosure() {
  51. fn := func() func(int) int {
  52. count := 0
  53. return func(i int) int {
  54. count++
  55. return count * i
  56. }
  57. }()
  58. for i := 1; i <= 5; i++ {
  59. fmt.Println(fn(i))
  60. }
  61. }
  62. func foo1() {
  63. fn := func(val uint) uint {
  64. s := strconv.Itoa(int(val))
  65. var newS string
  66. for i := 0; i < len(s); i++ {
  67. if s[i]%2 == 0 && s[i] != '0' {
  68. // fmt.Println(s[i])
  69. newS += string(s[i])
  70. }
  71. }
  72. fmt.Println(newS)
  73. if len(newS) == 0 {
  74. return 100
  75. } else {
  76. res, _ := strconv.Atoi(newS)
  77. return uint(res)
  78. }
  79. }
  80. fmt.Println(fn(0))
  81. }