github.com/tcnksm/go@v0.0.0-20141208075154-439b32936367/doc/play/pi.go (about)

     1  // Concurrent computation of pi.
     2  // See http://goo.gl/ZuTZM.
     3  //
     4  // This demonstrates Go's ability to handle
     5  // large numbers of concurrent processes.
     6  // It is an unreasonable way to calculate pi.
     7  package main
     8  
     9  import (
    10  	"fmt"
    11  	"math"
    12  )
    13  
    14  func main() {
    15  	fmt.Println(pi(5000))
    16  }
    17  
    18  // pi launches n goroutines to compute an
    19  // approximation of pi.
    20  func pi(n int) float64 {
    21  	ch := make(chan float64)
    22  	for k := 0; k <= n; k++ {
    23  		go term(ch, float64(k))
    24  	}
    25  	f := 0.0
    26  	for k := 0; k <= n; k++ {
    27  		f += <-ch
    28  	}
    29  	return f
    30  }
    31  
    32  func term(ch chan float64, k float64) {
    33  	ch <- 4 * math.Pow(-1, k) / (2*k + 1)
    34  }