https://go.dev/dl/.
Go dikenal sebagai bahasa pemrograman yang statically-typed, artinya setiap deklarasi variabel harus ditentukan tipe datanya dan tidak dapat diubah saat program berjalan. Ini berbeda dengan bahasa dynamic seperti PHP atau Python, di mana tipe data bisa berubah saat runtime.
Generics adalah fitur yang memungkinkan kita menulis fungsi, tipe data, atau struktur data yang dapat bekerja dengan berbagai tipe data tanpa harus menduplikasi kode untuk setiap tipe. Misalnya, jika kita ingin membuat fungsi penjumlahan untuk int64
dan float64
, tanpa generics kita harus menulis dua fungsi berbeda. Dengan generics, cukup satu fungsi saja yang bisa menangani keduanya.
Mari kita lihat perbandingannya.
Tanpa generics, kita harus menulis dua fungsi berbeda untuk menjumlahkan slice bertipe int64
dan float64
:
package main
import "fmt"
// Menjumlahkan slice bertipe int64
func SumInts(numbers []int64) int64 {
var sum int64
for _, number := range numbers {
sum += number
}
return sum
}
// Menjumlahkan slice bertipe float64
func SumFloats(numbers []float64) float64 {
var sum float64
for _, number := range numbers {
sum += number
}
return sum
}
func main() {
numbers64 := []int64{1, 2, 3, 4, 5}
floats64 := []float64{1.1, 1.2, 1.3, 1.4, 1.5}
fmt.Println("Sum ints :", SumInts(numbers64))
fmt.Println("Sum floats :", SumFloats(floats64))
}
Output di terminal:
$ go run main.go
Sum ints : 15
Sum floats : 6.5
Dengan generics, kita hanya perlu satu fungsi yang bisa menerima slice bertipe int64
atau float64
:
package main
import "fmt"
// Fungsi generik untuk menjumlahkan slice bertipe int64 atau float64
func SumIntsOrFloatsWithGenerics[T int64 | float64](numbers []T) T {
var sum T
for _, number := range numbers {
sum += number
}
return sum
}
func main() {
numbers64 := []int64{1, 2, 3, 4, 5}
floats64 := []float64{1.1, 1.2, 1.3, 1.4, 1.5}
ints64Generics := SumIntsOrFloatsWithGenerics(numbers64) // return int64
floats64Generics := SumIntsOrFloatsWithGenerics(floats64) // return float64
fmt.Println("Sum ints or floats with generics :", ints64Generics)
fmt.Println("Sum ints or floats with generics :", floats64Generics)
}
Output di terminal:
$ go1.18rc1 run main.go
Sum ints or floats with generics : 15
Sum ints or floats with generics : 6.5
Dengan generics, kita cukup menulis satu fungsi yang dapat menangani berbagai tipe data sesuai dengan kebutuhan.
Penulisan umum fungsi generik di Go:
func funcName[T ComparableType](params)
Pada contoh di atas:
func SumIntsOrFloatsWithGenerics[T int64 | float64](numbers []T) T {
// ...
}
T
adalah parameter tipe (type parameter) yang dapat berupa int64
atau float64
.numbers []T
berarti parameter berupa slice dengan elemen bertipe T
.T
juga.Jika kita ingin mendukung lebih banyak tipe data, kita bisa menggunakan interface sebagai type constraint:
type Number interface {
int32 | int64 | float32 | float64
}
func SumIntsOrFloatsWithGenerics[T Number](numbers []T) T {
var sum T
for _, number := range numbers {
sum += number
}
return sum
}
Dengan cara ini, fungsi generik bisa digunakan untuk berbagai tipe numerik yang didukung oleh interface Number
.
Generics sangat berguna ketika kita ingin membuat fungsi atau struktur data yang dapat digunakan untuk berbagai tipe data tanpa harus menulis kode yang sama berulang kali. Contoh kasus penggunaan generics antara lain:
Dengan adanya generics, kode menjadi lebih ringkas, mudah dipelihara, dan lebih fleksibel.
Generics adalah salah satu fitur besar yang membuat Go semakin powerful dan modern. Selamat mencoba!
← Back to home