aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/generics.article50
-rw-r--r--content/generics/index.go28
-rw-r--r--content/generics/list.go13
-rw-r--r--static/js/services.js1
-rw-r--r--static/js/values.js5
5 files changed, 97 insertions, 0 deletions
diff --git a/content/generics.article b/content/generics.article
new file mode 100644
index 0000000..f6ba848
--- /dev/null
+++ b/content/generics.article
@@ -0,0 +1,50 @@
+Generik
+Go mendukung pemrograman generik menggunakan parameter tipe. Pelajaran kali ini memperlihatkan beberapa contoh penerapan generik di dalam kode Anda.
+
+Para Penggubah Go
+https://golang.org
+
+* Parameter tipe
+
+Fungsi-fungsi pada Go dapat bekerja dengan beragam tipe menggunakan
+parameter tipe.
+Parameter tipe dari sebuah fungsi ditulis dalam kurung siku, sebelum
+argumen dari fungsi.
+
+ func Index[T comparable](s []T, x T) int
+
+Deklarasi di atas menyatakan bahwa `s` adalah sebuah slice bertipe `T`
+yang memenuhi syarat `comparable`.
+`x` juga variabel parameter dengan tipe yang sama.
+
+`comparable` adalah syarat yang memungkinkan penggunaan operator `==` dan
+`!=` terhadap nilai dari tipe.
+Pada contoh berikut, kita mengggunakan fungsi `Index` untuk membandingkan
+sebuah nilai dengan semua elemen dari slice sampai nilai yang sama
+ditemukan.
+Fungsi `Index` bekerja untuk semua tipe yang mendukung pembandingan.
+
+.play generics/index.go
+
+* Tipe generik
+
+Selain fungsi generik, Go juga mendukung tipe generik.
+Sebuah tipe dapat diberi parameter dengan parameter tipe, yang dapat berguna
+untuk mengimplementasikan struktur data generik.
+
+Contoh berikut memperlihatkan sebuah deklarasi tipe sederhana untuk
+linked-list yang dapat menyimpan tipe apa pun.
+
+Sebagai latihan, coba tambahkan beberapa fungsionalitas pada implementasi
+linked-list tersebut.
+
+.play generics/list.go
+
+* Selamat!
+
+Anda telah menyelesaikan pelajaran tentang generik!
+
+Anda dapat kembali ke daftar
+[[/list][modul]]
+untuk menemukan pelajaran lainnya, atau lanjut ke
+[[javascript:click('.next-page')][pelajaran selanjutnya]].
diff --git a/content/generics/index.go b/content/generics/index.go
new file mode 100644
index 0000000..2efb3d8
--- /dev/null
+++ b/content/generics/index.go
@@ -0,0 +1,28 @@
+//go:build OMIT
+
+package main
+
+import "fmt"
+
+// Index mengembalikan indeks pada slice s yang bernilai x, atau -1 bila x
+// tidak ditemukan.
+func Index[T comparable](s []T, x T) int {
+ for i, v := range s {
+ // v dan x bertipe T, yang memiliki syarat "comparable",
+ // sehingga dapat menggunakan operator "==".
+ if v == x {
+ return i
+ }
+ }
+ return -1
+}
+
+func main() {
+ // Index dapat digunakan untuk slice bertipe int.
+ si := []int{10, 20, 15, -10}
+ fmt.Println(Index(si, 15))
+
+ // Index juga dapat digunakan untuk slice bertipe string.
+ ss := []string{"foo", "bar", "baz"}
+ fmt.Println(Index(ss, "hello"))
+}
diff --git a/content/generics/list.go b/content/generics/list.go
new file mode 100644
index 0000000..144378c
--- /dev/null
+++ b/content/generics/list.go
@@ -0,0 +1,13 @@
+//go:build OMIT
+
+package main
+
+// List merepresentasikan linked-list yang dapat menyimpan nilai bertipe
+// apa pun.
+type List[T any] struct {
+ next *List[T]
+ val T
+}
+
+func main() {
+}
diff --git a/static/js/services.js b/static/js/services.js
index da5f79c..5ba758d 100644
--- a/static/js/services.js
+++ b/static/js/services.js
@@ -61,6 +61,7 @@ factory('run', ['$window', 'editor',
code += '\n' +
'-- go.mod --\n' +
'module example\n' +
+ 'go 1.18\n' +
'require golang.org/x/tour v0.0.0-20201207214521-004403599411\n' +
'-- go.sum --\n' +
'golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\n' +
diff --git a/static/js/values.js b/static/js/values.js
index 11a124e..b1fb894 100644
--- a/static/js/values.js
+++ b/static/js/values.js
@@ -23,6 +23,11 @@ value('tableOfContents', [{
'description': '<p>Belajar cara mendefinisikan method pada tipe, cara deklarasi interface, dan cara menggabungkan keduanya.</p>',
'lessons': ['methods']
}, {
+ 'id': 'generics',
+ 'title': 'Generics',
+ 'description': '<p>Belajar menggunakan parameter tipe pada fungsi dan struct di Go.</p>',
+ 'lessons': ['generics']
+}, {
'id': 'concurrency',
'title': 'Konkurensi',
'description': '<p>Go menyediakan fitur konkurensi sebagai bagian dari inti bahasa.</p><p>Modul ini mempelajari goroutines dan channels, dan cara menggunakannya pada pola konkurensi yang berbeda.</p>',