File tree Expand file tree Collapse file tree 1 file changed +61
-0
lines changed
intermediate/concurrency/goroutines Expand file tree Collapse file tree 1 file changed +61
-0
lines changed Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "fmt"
5+ "math/rand"
6+ "sync"
7+ "time"
8+ )
9+
10+ type Order struct {
11+ Id int
12+ status string
13+ }
14+
15+ func generateOrder (n int ) []* Order {
16+ orders := []* Order {}
17+
18+ for i := range n {
19+ order := Order {
20+ Id : i + 1 ,
21+ status : "pending" ,
22+ }
23+ orders = append (orders , & order )
24+ }
25+
26+ return orders
27+ }
28+
29+ func processOrder (orderChan <- chan * Order , wg * sync.WaitGroup ) {
30+ defer wg .Done ()
31+ // loop berikut menerima value dari channel terus menerus hingga ditutup.
32+ for order := range orderChan {
33+ time .Sleep (time .Duration (rand .Intn (500 )+ 10 ) * time .Millisecond )
34+ status := []string {"delivered" , "shipped" }[rand .Intn (2 )]
35+ order .status = status
36+ fmt .Printf ("procssing order: %d with status: %s\n " , order .Id , order .status )
37+ }
38+ }
39+
40+ func main () {
41+ var wg sync.WaitGroup
42+ wg .Add (2 )
43+
44+ n := 20
45+ orderChan := make (chan * Order , n )
46+
47+ go func () {
48+ wg .Done ()
49+ for _ , order := range generateOrder (n ) {
50+ orderChan <- order
51+ }
52+ // karena kita mengirim data ke channel pada function ini, maka kita dapat panggil fungsi close di sini
53+ close (orderChan )
54+ fmt .Printf ("done generating order\n " )
55+ }()
56+
57+ go processOrder (orderChan , & wg )
58+
59+ wg .Wait ()
60+ fmt .Printf ("All operation is done!\n " )
61+ }
You can’t perform that action at this time.
0 commit comments