Golang bukan merupakan bahasa pemrograman yang berorientasi objek. Tapi golang memiliki fitur seperti type, struct, method, reference dan interface yang memungkinkan untuk melakukan pemrograman yang mirip dengan OOP.
struct
sebuah tipe data abstract
berisi dari kumpulan dari berbagai type
struct bisa digunakan dalam konsep class
typeUserstruct { ID uint64 Name string}funcmain() {var user User user.ID =1 user.Name ="Jacky" fmt.Printf("%v\n", user)println(user.Name) user2 :=User{ID: 2, Name: "JetLee"} fmt.Printf("%v\n", user2)println(user2.Name)}
Method
Kita bisa mendefiniskan suatu method pada sebuah type.
Method adalah fungsi yang mempunyai argumen khusus receiver berupa type.
Type yang bisa dibuatkan method adalah type local, yaitu type yang ada dalam paket yang sama dengan method yang dibuat.
packagemain// ini error karena string bukan type local dalam paket mainfunc (m string) Salam() { m ="Selamat Pagi"println(m)}funcmain() {var str string str.Salam()}
Interface berisi kumpulan yang berisi method yang abstract
typeiinterface{method()}
Type lain akan mengimplementasikan method dalam interface
Tidak ada perintah implement, suatu interface akan dipenuhi secara implisit begitu ada yang mengimplementasikannya
packagemaintypeiinterface {method()}typemyStrstringfunc (m *myStr) method() {println(*m)}funcmain() {var i i str :=myStr("Hello") i =&str i.method()}
Jika suatu interface diinisiasi tapi tidak ada yang mengimplementasikannya akan terjadi error nil pointer dereference
packagemaintypeiinterface {method()}funcmain() {var i i i.method()}
Isi interface dapat dibayangkan sebagai sebuah pasangan nilai dan sebuah tipe: (nilai, type)
packagemaintypeiinterface{method()}typemyStrstringfunc (m *myStr) method() {println(*m)}funcmain() {var i i str :=myStr("Hello") i =&str i.method()describe(i)}funcdescribe(i I) { fmt.Printf("(%v, %T)\n", i, i)}
Interface Kosong
Interface kosong merupakan interface yang tidak memiliki method
Untuk mengklaim nilai interface harus dilakukan type asserting
var a interface{}a ="string"println(a.(string))a =falseprintln(a.(bool))if value, ok := a.(bool); ok {println(value)}myMap :=map[string]interface{}{"Satu": true, "Dua": "string", "Tiga": uint(3)}println(myMap["Satu"].(bool))println(myMap["Dua"].(string))println(myMap["Tiga"].(uint))
Penggunaan switch type dalam melakukan asserting
packagemaintypemyStrstringfuncmain() {var a interface{} a =myStr("Jacky")switch t := a.(type) {casestring :println("type string", t)casebool :println("type bool", t)casemyStr :println("type myStr", t)default :println("type lainnya", t) }}
Pseudo Object
tidak ada class dalam go, tapi kita bisa menggunakan type
variable class diganti dengan type struct
method class diganti dengan method dengan pointer reference
Method overloading dimungkinkan dengan reference yang berbeda
packagemainimport ("fmt")typebecakstruct { roda int warna string}typegerobakstruct { roda int warna string} func (o *becak) caraJalan() string {return"dikayuh"}func (o *gerobak) caraJalan() string {return"didorong"}funcmain() { becak :=new(becak)println("becak", "cara jalan:", becak.caraJalan()) gerobak :=new(gerobak)println("gerobak", "cara jalan:", gerobak.caraJalan())}
Encapsulation
Encapsulasi terjadi di level paket.
Kita bisa memilih kode (type, variabel, fungsi dll) yang hendak diexport ke luar paket dan mana yang hanya bisa diakses dalam paket yang sama.
Penamaan kode yang bersifat publik diawali dengan huruf besar.
Penamaan kode yang bersifat privat diawali dengan huruf kecil.
// file APP/latihan/kendaraan.gopackagelatihan// Kendaraan interfacetypeKendaraaninterface {CaraJalan() stringSetWarna(string)GetWarna() stringGetRoda() int}typebecakstruct { roda int warna string}func (o *becak) SetWarna(s string) { o.warna = s}func (o *becak) GetWarna() string {return o.warna}func (o *becak) GetRoda() int {return3}func (o *becak) CaraJalan() string {return"dikayuh"}// NewBecak function untuk membuat objek becakfuncNewBecak() Kendaraan {return&becak{}}