Skip to content

Commit 0b5fcfe

Browse files
committed
Merge branch 'master' of github.com:novalagung/dasarpemrogramangolang
2 parents 3629018 + 67475bc commit 0b5fcfe

File tree

86 files changed

+891
-833
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+891
-833
lines changed

content/2-instalasi-golang.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ Hal pertama yang perlu dilakukan sebelum bisa menggunakan Go adalah meng-*instal
44

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

7-
> Go yang digunakan adalah versi **1.20**, direkomendasikan menggunakan versi tersebut.
7+
> Go yang digunakan adalah versi **1.22**, direkomendasikan menggunakan versi tersebut.
88
99
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.
1010

1111
## A.2.1. Instalasi Go *Stable*
1212

13-
#### Instalasi Go di Windows
13+
#### Instalasi Go di Windows
1414

1515
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.
1616

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

2727
> 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.
2828

29-
#### Instalasi Go di MacOS
29+
#### Instalasi Go di MacOS
3030

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

3333
1. *Install* terlebih dahulu Homebrew (jika belum ada), caranya jalankan perintah berikut di **terminal**.
3434

3535
```bash
36-
$ ruby -e "$(curl -fsSL http://git.io/pVOl)"
36+
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
3737
```
3838

3939
2. *Install* Go menggunakan command `brew`.
@@ -57,7 +57,7 @@ Cara termudah instalasi Go di MacOS adalah menggunakan [Homebrew](http://brew.sh
5757

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

60-
#### Instalasi Go di Linux
60+
#### Instalasi Go di Linux
6161

6262
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`.
6363

content/A-array.md

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# A.15. Array
22

3-
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.
3+
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.
4+
5+
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.
46

57
Contoh penerapan array:
68

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

17-
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.
19+
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.
1820

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

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

23-
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.
25+
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.
2426

2527
```go
2628
var names [4]string
@@ -31,7 +33,7 @@ names[3] = "law"
3133
names[4] = "ez" // baris kode ini menghasilkan error
3234
```
3335

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

3638
## A.15.2. Inisialisasi Nilai Awal Array
3739

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

47-
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.
49+
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.
4850

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

51-
Fungsi `len()` dipakai untuk menghitung jumlah elemen sebuah array.
53+
Fungsi `len()` berfungsi untuk menghitung jumlah elemen sebuah array.
5254

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

@@ -69,11 +71,11 @@ fruits = [4]string{
6971
}
7072
```
7173

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

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

76-
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.
78+
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.
7779

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

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

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

8991
## A.15.5. Array Multidimensi
9092

91-
Array multidimensi adalah array yang tiap elemennya juga berupa array (dan bisa seterusnya, tergantung ke dalaman dimensinya).
93+
Array multidimensi adalah array yang tiap elemennya juga berupa array.
94+
95+
> Level kedalaman array multidimensi adalah tidak terbatas, bisa saja suatu array berisi elemen array yang setiap elemennya juga adalah nilai array, dst.
9296
93-
Cara deklarasi array multidimensi secara umum sama dengan cara deklarasi array biasa, dengan cara menuliskan data array dimensi selanjutnya sebagai elemen array dimensi sebelumnya.
97+
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.
9498

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

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

105-
Kedua array di atas memiliki elemen yang sama.
109+
Kedua array di atas memiliki jumlah dan isi elemen yang sama.
106110

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

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

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

113117
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:
114118

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

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

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

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

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

141-
Output program di atas, sama dengan output program sebelumnya, hanya cara yang digunakan berbeda.
145+
Output program di atas, sama persis dengan output program sebelumnya, hanya saja cara yang diterapkan berbeda.
142146

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

145-
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.
146-
147-
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.
149+
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:
148150

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

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

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

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

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

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

175-
Jika yang dibutuhkan hanya indeks elemen-nya saja, bisa gunakan 1 buah variabel setelah keyword `for`.
177+
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.
176178

177179
```go
178180
for i, _ := range fruits { }
@@ -182,7 +184,7 @@ for i := range fruits { }
182184

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

185-
Deklarasi sekaligus alokasi data array juga bisa dilakukan lewat keyword `make`.
187+
Deklarasi sekaligus alokasi kapasitas array juga bisa dilakukan lewat keyword `make`.
186188

187189
```go
188190
var fruits = make([]string, 2)
@@ -192,7 +194,7 @@ fruits[1] = "manggo"
192194
fmt.Println(fruits) // [apple manggo]
193195
```
194196

195-
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.
197+
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.
196198

197199
---
198200

content/A-buffered-channel.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# A.32. Buffered Channel
22

3-
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.
3+
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.
44

55
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).
66

77
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.
88

9-
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*.
9+
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.
1010

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

@@ -49,21 +49,21 @@ func main() {
4949

5050
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**.
5151

52-
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.
52+
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.
5353

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

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

5858
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).
5959

60-
Karena pengiriman dan penerimaan data via buffered channel terjadi tidak selalu sycnrhonous (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.
60+
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.
6161

62-
#### Fungsi `time.Sleep()`
62+
#### Fungsi `time.Sleep()`
6363

6464
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.
6565

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

6868
---
6969

0 commit comments

Comments
 (0)