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