|  | // Concurrent computation of pi. | 
|  | // See https://goo.gl/la6Kli. | 
|  | // | 
|  | // This demonstrates Go's ability to handle | 
|  | // large numbers of concurrent processes. | 
|  | // It is an unreasonable way to calculate pi. | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "math" | 
|  | ) | 
|  |  | 
|  | func main() { | 
|  | fmt.Println(pi(5000)) | 
|  | } | 
|  |  | 
|  | // pi launches n goroutines to compute an | 
|  | // approximation of pi. | 
|  | func pi(n int) float64 { | 
|  | ch := make(chan float64) | 
|  | for k := 0; k <= n; k++ { | 
|  | go term(ch, float64(k)) | 
|  | } | 
|  | f := 0.0 | 
|  | for k := 0; k <= n; k++ { | 
|  | f += <-ch | 
|  | } | 
|  | return f | 
|  | } | 
|  |  | 
|  | func term(ch chan float64, k float64) { | 
|  | ch <- 4 * math.Pow(-1, k) / (2*k + 1) | 
|  | } |