Dalam bahasa pemrograman Go (Golang), terdapat sebuah fitur yang sangat kuat dan fleksibel yang dikenal sebagai “interface”. Interface adalah salah satu aspek yang membedakan Golang dari bahasa pemrograman lainnya, dan dapat digunakan untuk mencapai abstraksi yang kuat dan modular dalam kode kita.
Apa itu Interface
Pada dasarnya, sebuah interface adalah sekumpulan definisi metode. Tidak seperti bahasa pemrograman lain yang menggunakan pendekatan “class-based” untuk mencapai polimorfisme, Golang menggunakan pendekatan “interface-based”.
Ini berarti bahwa sebuah tipe data tidak secara eksplisit mendeklarasikan bahwa ia mengimplementasikan sebuah interface, melainkan hanya dengan mengimplementasikan metode-metode yang didefinisikan dalam interface tersebut.
Contoh Interface Golang
Mari kita lihat contoh sederhana untuk memahami konsep ini dengan lebih baik. Anggaplah kita memiliki dua tipe data, “Square” dan “Circle”, yang mewakili bentuk geometri. Kedua tipe data ini memiliki metode “Area()” yang mengembalikan luas bentuk tersebut.
Dalam bahasa pemrograman lain, kita mungkin akan membuat sebuah hierarki class dengan metode “Area()” yang diwarisi oleh kedua kelas tersebut.
Namun, dalam Golang, kita dapat menggunakan interface untuk mencapai hal yang sama tanpa harus menggunakan hierarki class.
Berikut adalah contoh kode untuk membuat interface “Shape” dan mengimplementasikannya pada tipe data “Square” dan “Circle”:
package main import ( "fmt" "math" ) type Shape interface { Area() float64 } type Square struct { sideLength float64 } func (s Square) Area() float64 { return s.sideLength * s.sideLength } type Circle struct { radius float64 } func (c Circle) Area() float64 { return math.Pi * c.radius * c.radius } func main() { square := Square{sideLength: 5} circle := Circle{radius: 3} shapes := []Shape{square, circle} for _, shape := range shapes { fmt.Printf("Area: %.2f\n", shape.Area()) } }
Dalam contoh di atas, kita mendefinisikan sebuah interface bernama “Shape” yang memiliki satu metode, yaitu “Area()”. Kemudian, kita mengimplementasikan interface tersebut pada tipe data “Square” dan “Circle” dengan mendefinisikan metode “Area()” pada masing-masing tipe data tersebut.
Di dalam fungsi “main”, kita membuat variabel “square” dan “circle” sesuai dengan tipe data yang telah kita definisikan. Kemudian, kita membuat sebuah slice dari interface “Shape” yang berisi kedua variabel tersebut. Kita dapat melakukan ini karena “Square” dan “Circle” mengimplementasikan metode “Area()” yang didefinisikan dalam interface “Shape”.
Selanjutnya, kita melakukan iterasi melalui slice “shapes” dan memanggil metode “Area()” pada setiap elemennya. Meskipun kita tidak tahu tipe data sebenarnya dari setiap elemen di dalam slice, Golang secara otomatis menentukan metode yang harus dipanggil berdasarkan implementasi interface pada setiap tipe data.
Hasil keluaran dari program ini adalah:
Area: 25.00 Area: 28.27
Dalam contoh ini, kita melihat bahwa kita dapat memperlakukan objek dari tipe data yang berbeda sebagai objek yang sama melalui penggunaan interface “Shape”. Ini membuktikan kekuatan abstraksi yang diberikan oleh interface dalam Golang.
Penutup
Interface tidak hanya memungkinkan kita untuk mencapai polimorfisme, tetapi juga memfasilitasi pemisahan ketergantungan dan memungkinkan pengembangan yang lebih modular.
Kita dapat membuat interface yang mewakili kontrak yang harus diikuti oleh komponen lain dalam kode kita. Dengan demikian, kita dapat mengganti implementasi di belakang interface tersebut tanpa mempengaruhi kode lain yang bergantung pada interface tersebut.
Dalam Golang, interface adalah alat yang sangat kuat untuk mencapai abstraksi yang kokoh, modular, dan dapat diandalkan. Penggunaan yang bijaksana dari interface dapat membantu kita mengembangkan kode yang lebih mudah dipahami, dipelihara, dan diperluas.