Skip to content

Commit 57c827c

Browse files
committed
chore: menambahkan contoh penerapan channel
1 parent 4f9f684 commit 57c827c

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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+
}

0 commit comments

Comments
 (0)