diff options
| author | Shulhan <m.shulhan@gmail.com> | 2024-07-14 17:32:06 +0700 |
|---|---|---|
| committer | Shulhan <m.shulhan@gmail.com> | 2024-07-14 17:56:40 +0700 |
| commit | ba54eba987d1cd7d119d988e36d9a258949d48ee (patch) | |
| tree | 715410f0fe2d3c47805315385db02e525cd4b15f | |
| parent | 41e243797ea15adff220279d7b0ee240fb7aad85 (diff) | |
| download | golang-id-tour-ba54eba987d1cd7d119d988e36d9a258949d48ee.tar.xz | |
content: tambahkan artikel tentang Generik
Artikel Generik berisi dua bagian:
* Parameter tipe: contoh penggunaan parameter tipe pada fungsi generik
* Tipe generik: contoh struktur data generik
Perubahan ini berdasarkan golang.org/x/website@b970f4b5b0 .
| -rw-r--r-- | content/generics.article | 50 | ||||
| -rw-r--r-- | content/generics/index.go | 28 | ||||
| -rw-r--r-- | content/generics/list.go | 13 | ||||
| -rw-r--r-- | static/js/services.js | 1 | ||||
| -rw-r--r-- | static/js/values.js | 5 |
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>', |
