gofibonacci3.go 713 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. // courtesy of: http://sdh33b.blogspot.com/2009/12/fibonacci-in-go.html
  2. package main
  3. import (
  4. "fmt"
  5. "time"
  6. )
  7. func dup3(in <-chan int) (<-chan int, <-chan int, <-chan int) {
  8. a, b, c := make(chan int, 2), make(chan int, 2), make(chan int, 2)
  9. go func() {
  10. for {
  11. x := <-in
  12. a <- x
  13. b <- x
  14. c <- x
  15. }
  16. }()
  17. return a, b, c
  18. }
  19. func fib() <-chan int {
  20. x := make(chan int, 2)
  21. a, b, out := dup3(x)
  22. go func() {
  23. x <- 0
  24. x <- 1
  25. <-a
  26. for {
  27. x <- <-a + <-b
  28. }
  29. }()
  30. <- out
  31. return out
  32. }
  33. func main() {
  34. start := time.Now()
  35. x := fib()
  36. for i := 0; i < 10; i++ {
  37. fmt.Println(<-x)
  38. }
  39. end := time.Now()
  40. delta := end.Sub(start)
  41. fmt.Printf("longCalculation took this amount of time: %s\n", delta)
  42. }