github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2015/go-for-java-programmers/first.go (about) 1 // +build OMIT 2 3 package main 4 5 import ( 6 "fmt" 7 "math/rand" 8 "time" 9 ) 10 11 type Result string 12 type Search func(query string) Result 13 14 // START1 OMIT 15 func First(query string, replicas ...Search) Result { 16 c := make(chan Result, len(replicas)) 17 searchReplica := func(i int) { c <- replicas[i](query) } 18 for i := range replicas { 19 go searchReplica(i) 20 } 21 return <-c 22 } 23 24 // STOP1 OMIT 25 26 func init() { 27 rand.Seed(time.Now().UnixNano()) 28 } 29 30 // START2 OMIT 31 func main() { 32 start := time.Now() 33 result := First("golang", // HL 34 fakeSearch("replica 1"), // HL 35 fakeSearch("replica 2")) // HL 36 elapsed := time.Since(start) 37 fmt.Println(result) 38 fmt.Println(elapsed) 39 } 40 41 // STOP2 OMIT 42 43 func fakeSearch(kind string) Search { 44 return func(query string) Result { 45 time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) 46 return Result(fmt.Sprintf("%s result for %q\n", kind, query)) 47 } 48 }