Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Writing improvement section A #265

Merged
merged 68 commits into from
Apr 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
6637db0
feat: update A.32. Buffered Channel
novalagung Apr 22, 2024
9be5665
feat: update A.34. Channel - Range dan Close
novalagung Apr 22, 2024
494f87d
feat: update A.34. Channel - Range dan Close
novalagung Apr 22, 2024
92ed3c1
feat: update A.55. Simple Client HTTP Request
novalagung Apr 22, 2024
e9b5583
feat: A.33. Channel - Select
novalagung Apr 22, 2024
6652f22
feat: # A.35. Channel - Timeout
novalagung Apr 22, 2024
a92212b
feat: A.55. Simple Client HTTP Request
novalagung Apr 22, 2024
d488f06
feat: A.48. Arguments & Flag
novalagung Apr 22, 2024
365433e
feat: A.62. Concurrency Pattern: Pipeline
novalagung Apr 22, 2024
34b777a
feat: A.43. Konversi Antar Tipe Data
novalagung Apr 22, 2024
1f77e5d
feat: update A.31. Channel
novalagung Apr 23, 2024
4be74cc
feat: update A.50. File
novalagung Apr 23, 2024
396dcce
feat: semantic markdown update
novalagung Apr 23, 2024
58267f9
feat: semantic markdown update
novalagung Apr 23, 2024
d89bc3a
feat: update A.21. Fungsi Closure
novalagung Apr 23, 2024
cc8e83f
feat: update A.19. Fungsi Multiple Return
novalagung Apr 23, 2024
84e8eb6
feat: A.22. Fungsi Sebagai parameter
novalagung Apr 23, 2024
9d39bc7
feat: writing improvement
novalagung Apr 23, 2024
359c323
feat: update A.20. Fungsi Variadic
novalagung Apr 23, 2024
f45f517
feat: update exec content
novalagung Apr 23, 2024
e8ffe98
feat: update defer exit content
novalagung Apr 23, 2024
59a5884
feat: update encoding content
novalagung Apr 23, 2024
0e25d59
feat: update error panic recover content
novalagung Apr 23, 2024
270beca
Merge branch 'writing-improvement' of github.com:novalagung/dasarpemr…
novalagung Apr 23, 2024
f912d78
feat: update A.18. Fungsi
novalagung Apr 23, 2024
972ae7b
feat: update A.6. Command
novalagung Apr 23, 2024
4b4218c
feat: update A.65. Go Generics
novalagung Apr 23, 2024
6b9b777
feat: update A.4. GOPATH Dan Workspace
novalagung Apr 23, 2024
11b13ca
feat: update A.30. Goroutine
novalagung Apr 23, 2024
b9382f4
feat: update A.61. Go Vendoring
novalagung Apr 23, 2024
05da1db
feat: update A.47. Hash SHA1
novalagung Apr 23, 2024
082f31f
feat: update A.7. Program Pertama: Hello World
novalagung Apr 23, 2024
32e7a84
feat: update A.5. Instalasi Editor
novalagung Apr 23, 2024
692826a
feat: update images
novalagung Apr 23, 2024
e71b909
feat: update submodule
novalagung Apr 23, 2024
122c547
feat: update A.28. Any / interface{} / Interface Kosong
novalagung Apr 23, 2024
15dd92a
feat: update go version
novalagung Apr 23, 2024
c5dc1fe
feat: update A.27. Interface
novalagung Apr 24, 2024
8b22147
feat: update A.53. JSON Data
novalagung Apr 24, 2024
7bea8e7
feat: update A.8. Komentar
novalagung Apr 24, 2024
fcd5ab7
feat: update A.11. Konstanta
novalagung Apr 24, 2024
6290bc4
feat: update map chapter
novalagung Apr 25, 2024
36687d3
feat: update A.25. Method
novalagung Apr 25, 2024
2c78e05
feat: update A.26. Properti Public dan Private (Exported vs Unexported)
novalagung Apr 25, 2024
93455af
Merge remote-tracking branch 'origin/writing-improvement' into writin…
novalagung Apr 25, 2024
e19e234
feat: update A.4. GOPATH dan Workspace
novalagung Apr 25, 2024
e7d068b
feat: A.39. Random
novalagung Apr 25, 2024
d5fbb8f
feat: A.29. Reflect
novalagung Apr 25, 2024
e43b547
feat: update A.45. Regexp
novalagung Apr 25, 2024
b308ccd
feat: update A.13. Seleksi Kondisi
novalagung Apr 25, 2024
841a50e
feat: update A.3. Go Modules
novalagung Apr 25, 2024
1ef8275
feat: update A.63. Concurrency Pattern: Simplified Fan-out Fan-in Pip…
novalagung Apr 25, 2024
f20c444
feat: update A.16. Slice
novalagung Apr 25, 2024
6ffe462
feat: update A.38. Layout Format String
novalagung Apr 25, 2024
3bc3d65
feat: update A.44. Fungsi String
novalagung Apr 25, 2024
e1278f2
feat: update A.42. Time Duration
novalagung Apr 25, 2024
6c11168
feat: update wording
novalagung Apr 25, 2024
9689c3a
feat: update A.56. SQL
novalagung Apr 25, 2024
a96c80e
feat: update A.10. Tipe Data
novalagung Apr 25, 2024
59d44e8
feat: update A.52. URL Parsing
novalagung Apr 25, 2024
0b735f9
feat: update A.59. WaitGroup
novalagung Apr 25, 2024
f594dce
feat: update A.41. Timer, Ticker, & Scheduler
novalagung Apr 25, 2024
6d026ef
feat: update A.58. Unit Test
novalagung Apr 25, 2024
f03092e
feat: update A.9. Variabel
novalagung Apr 25, 2024
39380a2
feat: A.54. Web Service API Server
novalagung Apr 25, 2024
76a6c6d
feat: A.51. Web Server
novalagung Apr 25, 2024
fe01418
feat: update # A.40. Time, Parsing Time, & Format Time
novalagung Apr 25, 2024
877a80a
feat: update A.24. Struct
novalagung Apr 25, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions content/2-instalasi-golang.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ Hal pertama yang perlu dilakukan sebelum bisa menggunakan Go adalah meng-*instal

Di sini penulis mencoba meringkas petunjuk instalasi pada *link* di atas, agar lebih mudah untuk diikuti terutama untuk pembaca yang baru belajar.

> Go yang digunakan adalah versi **1.20**, direkomendasikan menggunakan versi tersebut.
> Go yang digunakan adalah versi **1.22**, direkomendasikan menggunakan versi tersebut.

URL untuk mengunduh *installer* Go: https://golang.org/dl/. Silakan langsung unduh dari *link* tersebut lalu lakukan proses instalasi, atau bisa mengikuti petunjuk pada chapter ini.

## A.2.1. Instalasi Go *Stable*

#### Instalasi Go di Windows
#### Instalasi Go di Windows

1. Download terlebih dahulu *installer*-nya di [https://golang.org/dl/](https://golang.org/dl/). Pilih *installer* untuk sistem operasi Windows sesuai jenis bit yang digunakan.

Expand All @@ -26,7 +26,7 @@ URL untuk mengunduh *installer* Go: https://golang.org/dl/. Silakan langsung und

> Sering terjadi, command `go version` tidak bisa dijalankan meskipun instalasi sukses. Solusinya bisa dengan restart CMD (tutup CMD, kemudian buka lagi). Setelah itu coba jalankan ulang command di atas.

#### Instalasi Go di MacOS
#### Instalasi Go di MacOS

Cara termudah instalasi Go di MacOS adalah menggunakan [Homebrew](http://brew.sh/).

Expand Down Expand Up @@ -57,7 +57,7 @@ Cara termudah instalasi Go di MacOS adalah menggunakan [Homebrew](http://brew.sh

5. Jika output adalah sama dengan versi Go yang ter-*install*, menandakan proses instalasi berhasil.

#### Instalasi Go di Linux
#### Instalasi Go di Linux

1. Unduh arsip *installer* dari [https://golang.org/dl/](https://golang.org/dl/), pilih installer untuk Linux yang sesuai dengan jenis bit komputer anda. Proses download bisa dilakukan lewat CLI, menggunakan `wget` atau `curl`.

Expand Down
50 changes: 26 additions & 24 deletions content/A-array.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# A.15. Array

Array adalah kumpulan data bertipe sama, yang disimpan dalam sebuah variabel. Array memiliki kapasitas yang nilainya ditentukan pada saat pembuatan, menjadikan elemen/data yang disimpan di array tersebut jumlahnya tidak boleh melebihi yang sudah dialokasikan. Default nilai tiap elemen array pada awalnya tergantung dari tipe datanya. Jika `int` maka tiap element zero value-nya adalah `0`, jika `bool` maka `false`, dan seterusnya. Setiap elemen array memiliki indeks berupa angka yang merepresentasikan posisi urutan elemen tersebut. Indeks array dimulai dari 0.
Array adalah kumpulan data bertipe sama, yang disimpan dalam sebuah variabel. Array memiliki kapasitas yang nilainya ditentukan pada saat pembuatan, menjadikan elemen/data yang disimpan di array tersebut jumlahnya tidak boleh melebihi yang sudah dialokasikan.

Default nilai tiap elemen array pada awalnya tergantung dari tipe datanya. Jika `int` maka tiap element zero value-nya adalah `0`, jika `bool` maka `false`, dan seterusnya. Setiap elemen array memiliki indeks berupa angka yang merepresentasikan posisi urutan elemen tersebut. Indeks array dimulai dari 0.

Contoh penerapan array:

Expand All @@ -14,13 +16,13 @@ names[3] = "law"
fmt.Println(names[0], names[1], names[2], names[3])
```

Variabel `names` dideklarasikan sebagai `array string` dengan alokasi elemen `4` slot. Cara mengisi slot elemen array bisa dilihat di kode di atas, yaitu dengan langsung mengakses elemen menggunakan indeks, lalu mengisinya.
Variabel `names` dideklarasikan sebagai `array string` dengan alokasi kapasitas elemen adalah `4` slot. Cara mengisi slot elemen array bisa dilihat di kode di atas, yaitu dengan langsung mengakses elemen menggunakan indeks, lalu mengisinya.

![Menampilkan elemen array](images/A_array_0_array.png)

## A.15.1. Pengisian Elemen Array yang Melebihi Alokasi Awal

Pengisian elemen array pada indeks yang tidak sesuai dengan alokasi menghasilkan error. Contoh sederhana, jika array memiliki 4 slot, maka pengisian nilai slot 5 seterusnya adalah tidak valid.
Pengisian elemen array pada indeks yang tidak sesuai dengan jumlah alokasi menghasilkan error. Contoh: jika array memiliki 4 slot, maka pengisian nilai slot 5 seterusnya adalah tidak valid.

```go
var names [4]string
Expand All @@ -31,7 +33,7 @@ names[3] = "law"
names[4] = "ez" // baris kode ini menghasilkan error
```

Solusi dari masalah di atas adalah dengan menggunakan keyword `append`, yang nantinya pada chapter selanjutnya ([A.16. Slice](/A-slice.html)) akan kita bahas.
Solusi dari masalah di atas adalah dengan menggunakan keyword `append`, yang pembahasannya ada pada chapter selanjutnya, ([A.16. Slice](/A-slice.html)).

## A.15.2. Inisialisasi Nilai Awal Array

Expand All @@ -44,11 +46,11 @@ fmt.Println("Jumlah element \t\t", len(fruits))
fmt.Println("Isi semua element \t", fruits)
```

Penggunaan fungsi `fmt.Println()` pada data array tanpa mengakses indeks tertentu, akan menghasilkan output dalam bentuk string dari semua array yang ada. Teknik ini biasa digunakan untuk *debugging* data array.
Penggunaan fungsi `fmt.Println()` pada data array tanpa mengakses indeks tertentu, menghasilkan output dalam bentuk string dari semua array yang ada. Teknik ini umum digunakan untuk keperluan *debugging* data array.

![Menghitung jumlah elemen dan menampilkan isi array](images/A_array_1_array_initialization_and_len.png)

Fungsi `len()` dipakai untuk menghitung jumlah elemen sebuah array.
Fungsi `len()` berfungsi untuk menghitung jumlah elemen sebuah array.

## A.15.3. Inisialisasi Nilai Array Dengan Gaya Vertikal

Expand All @@ -69,11 +71,11 @@ fruits = [4]string{
}
```

Khusus untuk deklarasi array dengan cara vertikal, tanda koma wajib dituliskan setelah elemen, termasuk elemen terakhir. Jika tidak, maka akan muncul error.
Khusus untuk deklarasi array dengan cara vertikal, tanda koma wajib dituliskan setelah setiap elemen (termasuk elemen terakhir), agar tidak memunculkan syntax error.

## A.15.4. Inisialisasi Nilai Awal Array Tanpa Jumlah Elemen

Deklarasi array yang nilainya diset di awal, boleh tidak dituliskan jumlah lebar array-nya, cukup ganti dengan tanda 3 titik (`...`). Jumlah elemen akan di kalkulasi secara otomatis menyesuaikan data elemen yang diisikan.
Deklarasi array yang nilainya diset di awal, boleh tidak dituliskan jumlah lebar array-nya, cukup ganti dengan tanda 3 titik (`...`). Metode penulisan ini membuat kapasitas array otomatis dihitung dari jumlah elemen array yang ditulis.

```go
var numbers = [...]int{2, 3, 2, 4, 3}
Expand All @@ -82,17 +84,19 @@ fmt.Println("data array \t:", numbers)
fmt.Println("jumlah elemen \t:", len(numbers))
```

Variabel `numbers` akan secara otomatis memiliki jumlah elemen `5`, karena pada saat deklarasi disiapkan 5 buah elemen.
Variabel `numbers` secara otomatis kapasitas elemennya adalah `5`.

![Deklarasi array menggunakan tanda 3 titik](images/A_array_1_1_array_dots.png)

## A.15.5. Array Multidimensi

Array multidimensi adalah array yang tiap elemennya juga berupa array (dan bisa seterusnya, tergantung ke dalaman dimensinya).
Array multidimensi adalah array yang tiap elemennya juga berupa array.

> Level kedalaman array multidimensi adalah tidak terbatas, bisa saja suatu array berisi elemen array yang setiap elemennya juga adalah nilai array, dst.

Cara deklarasi array multidimensi secara umum sama dengan cara deklarasi array biasa, dengan cara menuliskan data array dimensi selanjutnya sebagai elemen array dimensi sebelumnya.
Cara deklarasi array multidimensi secara umum sama dengan array biasa, bedanya adalah pada array biasa, setiap elemen berisi satu nilai, sedangkan pada array multidimensi setiap elemen berisi array.

Khusus untuk array yang merupakan sub dimensi atau elemen, boleh tidak dituliskan jumlah datanya. Contohnya bisa dilihat pada deklarasi variabel `numbers2` di kode berikut.
Khusus penulisan array yang merupakan subdimensi/elemen, boleh tidak dituliskan jumlah datanya. Contohnya bisa dilihat pada deklarasi variabel `numbers2` di kode berikut.

```go
var numbers1 = [2][3]int{[3]int{3, 2, 3}, [3]int{3, 4, 5}}
Expand All @@ -102,13 +106,13 @@ fmt.Println("numbers1", numbers1)
fmt.Println("numbers2", numbers2)
```

Kedua array di atas memiliki elemen yang sama.
Kedua array di atas memiliki jumlah dan isi elemen yang sama.

![Array multidimensi](images/A_array_2_array_multidimension.png)

## A.15.6. Perulangan Elemen Array Menggunakan Keyword `for`

Keyword `for` dan array memiliki hubungan yang sangat erat. Dengan memanfaatkan perulangan menggunakan keyword ini, elemen-elemen dalam array bisa didapat.
Keyword `for` dan array memiliki hubungan yang sangat erat. Dengan memanfaatkan perulangan/looping menggunakan keyword ini, elemen-elemen dalam array bisa didapat.

Ada beberapa cara yang bisa digunakan untuk me-looping data array, yg pertama adalah dengan memanfaatkan variabel iterasi perulangan untuk mengakses elemen berdasarkan indeks-nya. Contoh:

Expand All @@ -126,7 +130,7 @@ Perulangan di atas dijalankan sebanyak jumlah elemen array `fruits` (bisa diketa

## A.15.7. Perulangan Elemen Array Menggunakan Keyword `for` - `range`

Ada cara yang lebih sederhana me-looping data array, dengan menggunakan keyword `for` - `range`. Contoh pengaplikasiannya bisa dilihat di kode berikut.
Ada cara lain yang lebih sederhana untuk operasi perulangan array, yaitu menggunakan kombinasi keyword `for` - `range`. Contoh pengaplikasiannya bisa dilihat di kode berikut.

```go
var fruits = [4]string{"apple", "grape", "banana", "melon"}
Expand All @@ -138,13 +142,11 @@ for i, fruit := range fruits {

Array `fruits` diambil elemen-nya secara berurutan. Nilai tiap elemen ditampung variabel oleh `fruit` (tanpa huruf s), sedangkan indeks nya ditampung variabel `i`.

Output program di atas, sama dengan output program sebelumnya, hanya cara yang digunakan berbeda.
Output program di atas, sama persis dengan output program sebelumnya, hanya saja cara yang diterapkan berbeda.

## A.15.8. Penggunaan Variabel Underscore `_` Dalam `for` - `range`

Kadang kala ketika *looping* menggunakan `for` - `range`, ada kemungkinan di mana data yang dibutuhkan adalah elemen-nya saja, indeks-nya tidak. Sedangkan kode di atas, `range` mengembalikan 2 data, yaitu indeks dan elemen.

Seperti yang sudah diketahui, bahwa di Go tidak memperbolehkan adanya variabel yang menganggur atau tidak dipakai. Jika dipaksakan, error akan muncul, contohnya seperti kode berikut.
Terkadang, dalam penerapan *looping* menggunakan `for` - `range`, ada kebutuhan di mana yang dibutuhkan dari perulangan adlah adalah elemen-nya saja, sedangkan indeks-nya tidak, contoh:

```go
var fruits = [4]string{"apple", "grape", "banana", "melon"}
Expand All @@ -154,11 +156,11 @@ for i, fruit := range fruits {
}
```

Hasil dari kode program di atas:
Hasil dari kode program di atas adalah error, karena Go tidak memperbolehkan adanya variabel yang menganggur atau tidak dipakai.

![Error karena ada variabel yang tidak digunakan](images/A_array_4_for_range_error.png)

Di sinilah salah satu kegunaan variabel pengangguran, atau underscore (`_`). Tampung saja nilai yang tidak ingin digunakan ke underscore.
Di sinilah salah satu kegunaan dari variabel pengangguran, atau underscore (`_`). Tampung saja nilai yang tidak ingin digunakan ke underscore.

```go
var fruits = [4]string{"apple", "grape", "banana", "melon"}
Expand All @@ -172,7 +174,7 @@ Pada kode di atas, yang sebelumnya adalah variabel `i` diganti dengan `_`, karen

![For range tanpa indeks](images/A_array_5_for_range_underscore.png)

Jika yang dibutuhkan hanya indeks elemen-nya saja, bisa gunakan 1 buah variabel setelah keyword `for`.
Bagaiamana jika sebaliknya? Misal, yang dibutuhkan hanya indeks-nya saja, nilainya tidak penting. Maka cukup tulis satu variabel saja setelah keyword `for`, yaitu variabel penampung nilai indeks.

```go
for i, _ := range fruits { }
Expand All @@ -182,7 +184,7 @@ for i := range fruits { }

## A.15.9. Alokasi Elemen Array Menggunakan Keyword `make`

Deklarasi sekaligus alokasi data array juga bisa dilakukan lewat keyword `make`.
Deklarasi sekaligus alokasi kapasitas array juga bisa dilakukan lewat keyword `make`.

```go
var fruits = make([]string, 2)
Expand All @@ -192,7 +194,7 @@ fruits[1] = "manggo"
fmt.Println(fruits) // [apple manggo]
```

Parameter pertama keyword `make` diisi dengan tipe data elemen array yang diinginkan, parameter kedua adalah jumlah elemennya. Pada kode di atas, variabel `fruits` tercetak sebagai array string dengan alokasi 2 slot.
Parameter pertama keyword `make` diisi dengan tipe data elemen array yang diinginkan, parameter kedua adalah jumlah elemennya. Pada kode di atas, variabel `fruits` tercetak sebagai array string dengan kapasitas alokasi 2 slot.

---

Expand Down
12 changes: 6 additions & 6 deletions content/A-buffered-channel.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# A.32. Buffered Channel

Proses transfer data pada channel secara default dilakukan dengan cara **un-buffered**, atau tidak di-buffer di memori. Ketika terjadi proses kirim data via channel dari sebuah goroutine, maka harus ada goroutine lain yang menerima data dari channel yang sama, dengan proses serah-terima yang bersifat blocking. Maksudnya, baris kode setelah kode pengiriman dan penerimaan data tidak akan di proses sebelum proses serah-terima itu sendiri selesai.
Proses transfer data pada channel secara default dilakukan dengan metode **un-buffered** atau tidak di-buffer di memori. Ketika terjadi proses kirim data via channel dari sebuah goroutine, maka harus ada goroutine lain yang menerima data dari channel yang sama, dengan proses serah-terima yang bersifat blocking. Maksudnya, baris kode setelah kode pengiriman dan juga penerimaan data tidak akan diproses sebelum proses serah-terima itu sendiri selesai.

Buffered channel sedikit berbeda. Pada channel jenis ini, ditentukan angka jumlah buffer-nya. Angka tersebut menjadi penentu jumlah data yang bisa dikirimkan bersamaan. Selama jumlah data yang dikirim tidak melebihi jumlah buffer, maka pengiriman akan berjalan **asynchronous** (tidak blocking).

Ketika jumlah data yang dikirim sudah melewati batas buffer, maka pengiriman data hanya bisa dilakukan ketika salah satu data yang sudah terkirim adalah sudah diambil dari channel di goroutine penerima, sehingga ada slot channel yang kosong.

Proses pengiriman data pada buffered channel adalah *asynchronous* ketika jumlah data yang dikirim tidak melebihi batas buffer. Namun pada bagian channel penerimaan data selalu bersifat *synchronous*.
Proses pengiriman data pada buffered channel adalah *asynchronous* ketika jumlah data yang dikirim tidak melebihi batas buffer. Namun pada bagian channel penerimaan data selalu bersifat *synchronous* atau blocking.

![Analogi buffered channel](images/A_buffered_channel_1_anatomy.png)

Expand Down Expand Up @@ -49,21 +49,21 @@ func main() {

Pada kode di atas, parameter kedua fungsi `make()` adalah representasi jumlah buffer. Perlu diperhatikan bahwa nilai buffered channel dimulai dari `0`. Ketika nilainya adalah **3** berarti jumlah buffer maksimal ada **4**.

Bisa dilihat terdapat IIFE goroutine yang isinya proses penerimaan data dari channel `messages`, untuk kemudian datanya ditampilkan. Setelah goroutine tersebut dieksekusi, perulangan dijalankan dengan di-masing-masing perulangan dilakukan pengiriman data. Total ada 5 data dikirim lewat channel `messages` secara sekuensial.
Terdapat juga IIFE goroutine yang isinya proses penerimaan data dari channel `messages`, untuk kemudian datanya ditampilkan. Setelah goroutine tersebut dieksekusi, perulangan dijalankan dengan di-masing-masing perulangan dilakukan pengiriman data. Total ada 5 data dikirim lewat channel `messages` secara sekuensial.

![Implementasi buffered channel](images/A_buffered_channel_2_buffered_channel.png)

Bisa dilihat output di atas, pada proses pengiriman data ke-4, diikuti dengan proses penerimaan data; yang kedua proses tersebut berlangsung secara blocking.
Terlihat di output, proses pengiriman data indeks ke-4 adalah diikuti dengan proses penerimaan data yang proses transfernya sendiri dilakukan *syncrhonous* atau blocking.

Pengiriman data indeks ke 0, 1, 2 dan 3 akan berjalan secara asynchronous, hal ini karena channel ditentukan nilai buffer-nya sebanyak 3 (ingat, jika nilai buffer adalah 3, maka 4 data yang akan di-buffer). Pengiriman selanjutnya (indeks 5) hanya akan terjadi jika ada salah satu data dari ke-empat data yang sebelumnya telah dikirimkan sudah diterima (dengan serah terima data yang bersifat blocking). Setelahnya, pengiriman data kembali dilakukan secara asynchronous (karena sudah ada slot buffer ada yang kosong).

Karena pengiriman dan penerimaan data via buffered channel terjadi tidak selalu synchronous (tergantung jumlah buffer-nya), maka ada kemungkinan dimana eksekusi program selesai namun tidak semua data diterima via channel `messages`. Karena alasan ini pada bagian akhir ditambahkan statement `time.Sleep(1 * time.Second)` agar ada jeda 1 detik sebelum program selesai.

#### Fungsi `time.Sleep()`
#### Fungsi `time.Sleep()`

Fungsi ini digunakan untuk menambahkan delay sebelum statement berikutnya dieksekusi. Durasi delay ditentukan oleh parameter, misal `1 * time.Second` maka durasi delay adalah 1 detik.

Lebih detailnya mengenai fungsi `time.Sleep()` dan `time.Second` dibahas pada chapter terpisah, yaitu [Time Duration](https://dasarpemrogramangolang.novalagung.com/A-time-duration.html).
Lebih detailnya mengenai fungsi `time.Sleep()` dan `time.Second` dibahas pada chapter terpisah, yaitu [Time Duration](/A-time-duration.html).

---

Expand Down
Loading
Loading