You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: intermediate/concurrency/goroutines/README.md
+60-2Lines changed: 60 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -149,11 +149,69 @@ Selanjutnya, mari kita perhatikan goroutine `go alphabets()` dan `go numbers()`.
149
149
## Mendeklarasikan Channel
150
150
Berikut cara mendeklarasikan, mengirim dan menerima data dari channel (kode diambil dari [https://golangbot.com/channels/](https://golangbot.com/channels/))
151
151
152
+
### unbuffered channel
152
153
```Go
153
154
a:=make(chanint) // mendeklarasikan channel dengan tipe data integer
155
+
```
156
+
157
+
### buffered channel
158
+
channel juga dapat memiliki kapasitas (buffered), cukup dengan menspesifikasikan kapasitas/panjang data pada argument kedua fungsi make()
159
+
```go
160
+
// buffered channel dengan kapasitas 10
161
+
b:=make(chanint, 10)
162
+
```
163
+
164
+
buffered channel dapat digunakan untuk proses asinkron dimana data dapat disimpan dahulu hingga kapasitas penuh sebelum dikonsumsi goroutine lain.
165
+
166
+
## Range dan close
167
+
Pengirim dapat menutup (close) channel untuk mengindikasikan bahwa tidak ada lagi value yang akan dikirim. Penerima dapat mengecek apakah channel sudah ditutup dengan meng-*assign* argumen kedua. [sumber](https://go.dev/tour/concurrency/4)
168
+
```go
169
+
v, ok:=<-a
170
+
```
171
+
ok adalah false jika tidak ada lagi value yang diterima dan channel ditutup
172
+
173
+
channel juga dapat diiterasi menggunakan for loop:
174
+
175
+
```go
176
+
forval:=range a
177
+
```
178
+
ia menerima value dari channel secara terus menerus hingga channel ditutup
179
+
180
+
## data flow
181
+
Seperti terlihat pada contoh code sebelumnya, dapat dilihat bahwa data pada channel mengalir berdasarkan arah panah
182
+
183
+
### contoh
184
+
```go
185
+
chan1:=make(chanint)
186
+
num:=1
187
+
chan1 <- num // chan1 menerima (receive) data dari variabel num
188
+
varoutint
189
+
out:=<- chan1 // chan1 mengirim (send) data ke variabel out
190
+
```
154
191
155
-
data:=<- a // mengirim data dari channel a dan menyimpan hasilnya ke dalam variabel data
156
-
a <- data // channel a menerima data dari variabel data
192
+
### contoh data flow data channel pada parameter fungsi
193
+
```go
194
+
// contoh fungsi dengan parameter channel yang hanya menerima data channel
195
+
functerima(data <-chanint) {
196
+
receive:=<-data
197
+
num:=1
198
+
fmt.Printf("%d\n", receive)
199
+
}
200
+
201
+
// contoh fungsi dengan parameter channel yang hanya mengirim data ke channel
202
+
funckirim(datachan<- int) {
203
+
num:=1
204
+
data <- num
205
+
close(data)
206
+
// NOTE: channel sebaiknya ditutup dari sisi pengirim
207
+
// untuk menghindari goroutine penerima menunggu terus (deadlock)
208
+
}
209
+
210
+
// contoh fungsi dengan parameter channel yang dapat mengirim maupun menerima data pada channel (bidirectional)
0 commit comments