Salah satu pertanyaan pertama yang muncul di benak programmer yang mempertimbangkan untuk beralih dari bahasa pemrograman berorientasi objek seperti Java dan C# ke Golang adalah apakah mereka dapat menerapkan prinsip berorientasi objek yang sama ke Go. Untuk jawaban atas pertanyaan ini, kita bisa melihat di FAQ go.dev;

Apakah Go merupakan bahasa berorientasi objek?

Iya dan tidak. Meskipun Go memiliki tipe dan metode serta memungkinkan gaya pemrograman berorientasi objek, tidak ada hierarki tipe. Konsep “antarmuka” di Go memberikan pendekatan berbeda yang kami yakini mudah digunakan dan dalam beberapa hal lebih umum. Ada juga cara untuk menyematkan tipe pada tipe lain untuk memberikan sesuatu yang analog — namun tidak identik — dengan subkelas. Selain itu, metode di Go lebih umum dibandingkan di C++ atau Java: metode ini dapat didefinisikan untuk jenis data apa pun, bahkan tipe data bawaan seperti bilangan bulat biasa yang “tidak dikotakkan”. Mereka tidak terbatas pada struct (kelas).

Selain itu, kurangnya hierarki tipe membuat “objek” di Go terasa jauh lebih ringan dibandingkan bahasa seperti C++ atau Java.

Pada artikel ini, kita akan membahas bagaimana konsep pemrograman berorientasi objek dapat diimplementasikan menggunakan Go.

ENKAPSULASI

Enkapsulasi menjaga data aman dari gangguan eksternal. Dalam bahasa oop, hal ini dilakukan pada tingkat objek dengan menggunakan pengubah akses. Namun di Golang, hal ini dilakukan pada tingkat paket.

Go tidak memiliki pengubah akses seperti publik, pribadi, atau terlindungi. Sebaliknya, ada bidang yang diekspor dan tidak diekspor. Perbedaan ini berasal dari huruf pertama variabel. Huruf kecil berarti tidak diekspor, modal berarti diekspor. Anda dapat menganggap perbedaan ini sebagai perbedaan pribadi atau publik.

Perbedaan lain yang kami lihat adalah tidak ada kelas tetapi kami memiliki struktur. Alasannya adalah Go muncul sebagai alternatif untuk C dan C++ dan struct terutama digunakan dalam bahasa-bahasa tersebut.

Ini adalah visibilitas tingkat paket, jadi variabel yang dimulai dengan huruf kecil tidak terlihat dari luar paket tempatnya berada.

Warisan

Dalam OOP, program komputer dirancang sedemikian rupa dimana segala sesuatunya merupakan suatu objek yang saling berinteraksi satu sama lain. Warisan adalah bagian integral dari bahasa OOP yang memungkinkan properti dari satu kelas diwarisi oleh kelas lainnya. Ini pada dasarnya membantu dalam menggunakan kembali kode dan membangun hubungan antara kelas yang berbeda.

Di Go, kita bisa menggunakan komposisi untuk mendapatkan hasil serupa.

Dalam contoh di atas, struct mobil sedang disematkan oleh struktur lain secara anonim.

Artinya kita punya akses langsung ke ladang. Cara ini mirip dengan yang biasa kita lakukan di sisi OOP.

Dalam contoh sepeda motor, kita menugaskan satu struktur ke bidang lain. Di sini, diakses melalui atributnya.

Perbedaan ini menentukan cara kita mengakses data, namun keduanya berfungsi sebagai metode pewarisan yang valid.

Konstruktor

Konstruktor adalah fungsi khusus untuk membuat beberapa instance objek serupa secara andal dalam bahasa oop berbasis kelas.

Tidak ada definisi khusus untuk inisialisasi di GO, tetapi kita dapat melakukan hal yang sama dengan menulis sebuah fungsi.

Fungsi Pelanggan Baru di atas melakukan pekerjaan yang sama seperti konstruktor dalam bahasa oop.

Sebagai catatan kecil di sini, ada konsep nilai Default atau Kosong di Go. Semuanya diinisialisasi menjadi sesuatu.

type Customer struct {
   Name string // " "
   Age  int    // 0
}

Kesalahan ini, yang disebut “NullReferenceException” di C#, “NullPointerException” di Java dan tidak ada nilai yang ditetapkan saat inisialisasi, tidak muncul di GO.

POLIMORPISME

Golang mendukung polimorfisme melalui antarmuka saja. Suatu tipe mengimplementasikan antarmuka jika ia memberikan definisi untuk semua metode yang dideklarasikan dalam antarmuka.

Dalam contoh di atas, Guitar mengimplementasikan antarmuka Instrumen dengan memberikan definisi metode Play yang merupakan satu-satunya metode yang dideklarasikan dalam antarmuka.

ENUM

Enum adalah tipe data yang kuat untuk Data yang Dihitung dalam bahasa oop. Di sisi Go, kita hanya bisa menggunakan konstanta dan menetapkan nilai yang bertambah dengan menggunakan sedikit pun. Padahal kelebihan menggunakan Enum adalah kita tidak perlu memberi perintah secara eksplisit.

GENERIK

Generics in Go adalah konsep baru yang hadir dengan versi 1.18. Ini disebut parameter tipe dan kita bisa mendapatkan tipe parameter fungsi dari antarmuka yang harus kita definisikan yang dapat berisi beberapa tipe yang dapat diterima. Dengan cara ini, kita dapat menghilangkan ketergantungan tipe parameter dan membuat fungsi yang dapat digunakan kembali. Kita juga dapat menggunakan ini untuk membuat parameter tipe lebih lanjut.

Dalam contoh di atas, fungsi PlayInstrument menerima nilai apa pun yang memenuhi kontrak antarmuka “Instrumen”.

Kesimpulan

Golang mempromosikan pandangan menarik tentang pemrograman berorientasi objek dengan penggunaan antarmuka meskipun tidak dimaksudkan sebagai bahasa OOP. Implementasi pemrograman berorientasi objek di Go sangat fleksibel, langsung dan ringan.

Penggunaan OOP di Go mungkin terasa aneh, namun mendapatkan semua keuntungan dari Go tanpa kerangka kerja yang haus sumber daya jelas merupakan nilai tambah yang besar bagi banyak pengembang.