func produce(source int, permutation func(int) int) func() int { return func() int { // lambda source = permutation(source) // source return source } }  func mutate(j int) int { return (1664525*j + 1013904223) % 2147483647 }  next := produce(1, mutate) next()  package main import ( "fmt" ) func produce(source int, permutation func(int) int) func() int { return func() int { // lambda source = permutation(source) // source return source } } //     func mutate(j int) int { return (1664525*j + 1013904223) % 2147483647 } func main() { next := produce(1, mutate) //      fmt.Println(next()) fmt.Println(next()) fmt.Println(next()) fmt.Println(next()) fmt.Println(next()) }  type MyType string //  func (arg MyType) JustPrint(){ //  fmt.Println(arg) }  timer := time.AfterFunc(50 * time.Millisecond, arg.JustPrint)  package main import ( "fmt" "time" ) type MyType string //  func (arg MyType) JustPrint() { //  fmt.Println(arg) } func main() { arg := MyType("Hello") //  time.AfterFunc(50*time.Millisecond, arg.JustPrint) arg = "By" time.AfterFunc(75*time.Millisecond, arg.JustPrint) time.Sleep(100 * time.Millisecond) }  func Fib(n int) int { if n == 0 { return 0 } if n == 1 { return 1 } first := Fib(n - 1) second := Fib(n - 2) if first > max { //     panic(second) //       } return first + second }  var max int = 200 func CallFib(n int) (res int) { defer func() { if r := recover(); r != nil { //  res = r.(int) //  } }() res = Fib(n) return }  package main import "fmt" var max int = 1000 func Fib(n int) int { if n == 0 { return 0 } if n == 1 { return 1 } first := Fib(n - 1) second := Fib(n - 2) if first > max { //     panic(second) //       } return first + second } func CallFib(n int) (res int) { defer func() { if r := recover(); r != nil { //  res = r.(int) //  } }() res = Fib(n) return } func main() { fmt.Println(CallFib(10)) //  fmt.Println(CallFib(100000)) // fmt.Println(" ") }  type stateFn func(Machine) stateFn  func run(m Machine) { for state := start; state != nil; { state = state(m) } }  type stateFn func(*lexer) stateFn type lexer struct { *bufio.Reader //   }  func lexText(l *lexer) stateFn { for r, _, err := l.ReadRune(); err != io.EOF; r, _, err = l.ReadRune() { if '0' <= r && r <= '9' { //   l.UnreadRune() return lexNumber //  } } return nil //  . } func lexNumber(l *lexer) stateFn { var s string for r, _, err := l.ReadRune(); err != io.EOF; r, _, err = l.ReadRune() { if '0' > r || r > '9' { //   num, _ := strconv.Atoi(s) return lexText //  } s += string(r) } num, _ := strconv.Atoi(s) return nil //  . }  package main import ( "bufio" "fmt" "io" "strconv" "strings" ) type stateFn func(*lexer) stateFn func run(l *lexer) { for state := lexText; state != nil; { state = state(l) } } type lexer struct { *bufio.Reader //  ,   } var output = make(chan int) //  func lexText(l *lexer) stateFn { for r, _, err := l.ReadRune(); err != io.EOF; r, _, err = l.ReadRune() { if '0' <= r && r <= '9' { //   l.UnreadRune() return lexNumber //  } } close(output) return nil //  . } func lexNumber(l *lexer) stateFn { var s string for r, _, err := l.ReadRune(); err != io.EOF; r, _, err = l.ReadRune() { if '0' > r || r > '9' { num, _ := strconv.Atoi(s) output <- num //   return lexText //  } s += string(r) } num, _ := strconv.Atoi(s) output <- num close(output) return nil //  . } func main() { var sum int a := "hell 3456 fgh 25 fghj 2128506 fgh 77" // ,     fmt.Println("  : ", a) rr := strings.NewReader(a) //    lexy := lexer{bufio.NewReader(rr)} go run(&lexy) //    for nums := range output { fmt.Println(nums) sum += nums } fmt.Println("  : ", sum) }  Decoder = NewDecoder(r io.Reader) err = Decoder.Decode(Message)  reader1 := strings.NewReader("      ") reader2 := strings.NewReader("      ")  writer := os.Stdout  stop := time.After(10000 * time.Millisecond) tick := time.Tick(150 * time.Millisecond) tack := time.Tick(200 * time.Millisecond)  select { case <-tick: io.CopyN(writer, reader1, 5) case <-tack: io.CopyN(writer, reader2, 5) case <-stop: return }  package main import ( "io" "os" "strings" "time" ) func main() { stop := time.After(10000 * time.Millisecond) tick := time.Tick(150 * time.Millisecond) tack := time.Tick(200 * time.Millisecond) reader1 := strings.NewReader("      ") reader2 := strings.NewReader("      ") writer := os.Stdout for { select { case <-tick: io.CopyN(writer, reader1, 5) case <-tack: io.CopyN(writer, reader2, 5) case <-stop: return } } } Source: https://habr.com/ru/post/280210/
All Articles