Published on

Struct

Authors

Dalam pemrograman berorientasi object tentunya kita pasti mengenal apa itu class, enkapsulasi, inheritance, polimorfisme, dan lain sebagainya. Apakah semuanya masih bisa kita pakai dalam golang? Tentu tidak, tapi sebelum membahas lebih lanjut tentang konsep OOP sebaiknya kita perlu mengetahui tipe data dasar untuk OOP di golang yaitu struct.

Struct

tl;dr

  • tidak ada class, adanya struct
  • tidak ada inheritance, tapi menggunakan komposisi
  • tidak ada konstruktor, tapi menggunakan return [pointer] function
  • public access modifier menggunakan nama fungsi/peubah huruf besar
  • public access modifier menggunakan nama fungsi/peubah huruf kecil

Struct merupakan tipe data dasar yang digunakan untuk menggantikan fungsi dari class di bahasa pemrograman lain seperti C#, Java, C++, dll. Perlu kita tahu bahwa konsep OOP golang merupakan versi sederhana dari OOP itu sendiri. Mengapa sederhana? Karena dalam golang tidak ada konsep inheritance tapi lebih pada composition. Jadi menghilangkan konsep inheritance untuk mengurangi kompleksitas dari suatu struct dan jika ingin menggunakan struct lain bisa menggunakan konsep komposisi. Untuk lebih jelasnya seperti contoh kode dibawah ini.


_8
type Persegi struct{
_8
S float64
_8
}
_8
_8
type Kubus struct{
_8
Alas Persegi
_8
Tinggi float64
_8
}

Fungsi dalam struct

Dalam contoh diatas dalam bahasa pemrograman seperti Java, kelas kubus bisa didefinisikan sebagai turunan dari Persegi sedangkan dalam golang menggunakan tipe data Persegi untuk membuat suat peubah sebagai penyusun struct Kubus. Untuk method seperti contoh dibawah ini.


_13
// contoh public method dalam struct Persegi
_13
func(p *Persegi) Luas() float64{
_13
return p.S * p.S
_13
}
_13
_13
// contoh private method dalam struct Persegi
_13
func(p *Persegi) jumlahSisi() int {
_13
return 4
_13
}
_13
_13
func(k *Kubus) Volume() float64 {
_13
return k.Alas.Luas() * k.Tinggi
_13
}

Penggunaan peubah p dalam func(p *Persegi) boleh diganti dengan apa saja, tentunya harus sesuai dengan konteks agar tidak membingungkan saat ngoding. Peubah p ini berfungsi sebagai this jika kita melihat dari sisi Java atau C#.

Access Modifier

Apa yang membedakan access modifier dalam kedua fungsi diatas? Iyap, benar sekali perbedaan huruf kapital nama fungsi. Didalam golang penggunaan huruf kapital merepresentasikan public akses sedangkan nama fungsi yang diawali dengan huruf kecil merepresentasikan private akses.

Konstruktor

Lalu bagaimana untuk inisialisasi struct? Perlu diketahui didalam golang juga tidak ada konstruktor. Jika tidak ada konstruktor bagaimana untuk inisialisasi struct? Pastinya sudah ada cara tersendiri untuk inisialisasi struct yaitu menggunakan fungsi yang mengembalikan nilai pointer dari suatu struct. Lebih jelasnya seperti berikut.


_3
func NewPersegi(s float64) *Persegi{
_3
return &Persegi{S: s}
_3
}

Berikut contoh lengkap kode terkait dengan struct persegi.


_27
package main
_27
_27
import (
_27
"fmt"
_27
)
_27
_27
type Persegi struct {
_27
S float64
_27
}
_27
_27
func (p *Persegi) Luas() float64 {
_27
return p.S * p.S
_27
}
_27
_27
// contoh private method dalam struct Persegi
_27
func (p *Persegi) jumlahSisi() int {
_27
return 4
_27
}
_27
_27
func NewPersegi(s float64) *Persegi {
_27
return &Persegi{S: s}
_27
}
_27
_27
func main() {
_27
a := NewPersegi(4)
_27
fmt.Println(a.Luas())
_27
}

Struct dan Pointer

Dalam contoh fungsi diatas menggunakan pointer untuk deklarasi func(p *Persegi),apa bedanya jika tidak menggunakan pointer? Kita gunakan eksperimen untuk mengubah nilai S dalam struct Persegi, satu menggunakan pointer satunya tidak menggunakan. Berikut contoh kodenya.


_23
func (p *Persegi) UbahS(s float64){
_23
p.S = s
_23
}
_23
_23
func (p Persegi) UbahS2(s float64) {
_23
p.S = s
_23
}
_23
_23
func main() {
_23
a := NewPersegi(4)
_23
fmt.Println(a.Luas(), a.S)
_23
a.UbahS(5)
_23
fmt.Printf("ubah dengan [pointer] %f\n", a.S)
_23
_23
a.UbahS2(10)
_23
fmt.Printf("ubah tanpa [pointer] %f\n", a.S)
_23
}
_23
// Hasilnya
_23
// 16 4
_23
// ubah dengan [pointer] 5.000000
_23
// ubah tanpa [pointer] 5.000000
_23
_23
// Program exited.

Jika penasaran hasilnya, anda bisa mencoba sendiri contoh di play.golang.org. Dari contoh diatas bahwa fungsi yang menggunakan pointer akan berpengaruh ke struct asal sedangkan fungsi UbahS2 tidak berpengaruh pada nilai S karena jika tanpa menggunakan pointer maka akses peubah p merupakan copy struct bukan sebagai reference dari struct.

Sampai jumpa di tulisan selanjutnya...