github.com/packtpublishing/learning-functional-programming-in-go@v0.0.0-20230130084745-8b849f6d58c4/Chapter08/04_buffered_cpus/ex1.go (about) 1 package main 2 3 import ( 4 "fmt" 5 gc "github.com/go-goodies/go_currency" 6 "runtime" 7 ) 8 9 func main() { 10 orders := GetOrders() 11 numberOfOrders := len(orders) 12 cpus := runtime.NumCPU() 13 runtime.GOMAXPROCS(cpus) 14 input := make(chan Order, cpus) 15 output := make(chan Order, cpus) 16 for i := 0; i < numberOfOrders; i++ { 17 go func() { 18 for order := range input { 19 output <- Pipeline(order) 20 } 21 }() 22 } 23 for _, order := range orders { 24 input <- *order 25 } 26 close(input) 27 for i := 0; i < numberOfOrders; i++ { 28 fmt.Println("The result is:", <-output) 29 } 30 } 31 32 33 // close the input channel so start() will exit and can clean up after 34 // itself if it so wishes. 35 36 func Pipeline(o Order) Order { 37 o = Authenticate(o) 38 o = Decrypt(o) 39 o = Charge(o) 40 return o 41 } 42 43 44 func Authenticate(o Order) Order { 45 fmt.Printf("Order %d is Authenticated\n", o.OrderNumber) 46 return o 47 } 48 49 func Decrypt(o Order) Order { 50 fmt.Printf("Order %d is Decrypted\n", o.OrderNumber) 51 return o 52 } 53 54 func Charge(o Order) Order { 55 fmt.Printf("Order %d is Charged\n", o.OrderNumber) 56 return o 57 } 58 59 60 61 type Order struct { 62 OrderNumber int 63 IsValid bool 64 Credentials string 65 CCardNumber string 66 CCardExpDate string 67 LineItems []LineItem 68 } 69 70 type LineItem struct { 71 Description string 72 Count int 73 PriceUSD gc.USD 74 } 75 func GetOrders() []*Order { 76 77 order1 := &Order{ 78 10001, 79 true, 80 "alice,secret", 81 "7b/HWvtIB9a16AYk+Yv6WWwer3GFbxpjoR+GO9iHIYY=", 82 "0922", 83 []LineItem{ 84 LineItem{"Apples", 1, gc.USD{4, 50}}, 85 LineItem{"Oranges", 4, gc.USD{12, 00}}, 86 }, 87 } 88 89 order2 := &Order{ 90 10002, 91 true, 92 "bob,secret", 93 "EOc3kF/OmxY+dRCaYRrey8h24QoGzVU0/T2QKVCHb1Q=", 94 "0123", 95 []LineItem{ 96 LineItem{"Milk", 2, gc.USD{8, 00}}, 97 LineItem{"Sugar", 1, gc.USD{2, 25}}, 98 LineItem{"Salt", 3, gc.USD{3, 75}}, 99 }, 100 } 101 orders := []*Order{order1, order2} 102 return orders 103 }