Kita dapat memasukkan struct ke dalam struct seperti halnya tipe data biasa. Seperti terlihat pada kode dibawah ini.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package main import "fmt" type position struct { x, y float32 } type circle struct { p position r float32 } type rectangle struct { p position w, h float32 } func main() { c := circle{position{10, 10}, 20} fmt.Println("posisi x :", c.p.x, ", y :", c.p.y, ", r:", c.r) r := rectangle{position{5, 5}, 10, 20} fmt.Println("posisi x :", c.p.x, ", y :", c.p.y, ", w:", r.w, ", h:", r.h) } |
1 2 |
posisi x : 10 , y : 10 , r: 20 posisi x : 10 , y : 10 , w: 10 , h: 20 |
Pada contoh di atas kita dapat mengakses posisi dari circle dan rectangle dengan pengakses variable p, dan mendapatkan nilai dari x dan y nya. Struct diatas adalah struct normal tidak ada keistemewaan.
Namun yang akan kita bahas di disini adalah embeded struct atau kalau bahasa programming lain bisa disebut dengan inheritance. Maksut dari inheritance adalah kita dapat mengakses semua yang ada pada struct yang kita embed ke struct baru dan kita juga dapat mengakses method dari parentnya dari struct anak. Perhatikan contoh berikut :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package main import "fmt" type position struct { x, y float32 } type circle struct { position r float32 } type rectangle struct { position w, h float32 } func (p position) printMe() { fmt.Println("Me printed :", p) } func main() { c := circle{position{10, 10}, 20} fmt.Println("posisi x :", c.x, ", y :", c.y, ", r:", c.r) r := rectangle{position{5, 5}, 10, 20} fmt.Println("posisi x :", c.x, ", y :", c.y, ", w:", r.w, ", h:", r.h) c.printMe() r.printMe() } |
1 2 3 4 |
posisi x : 10 , y : 10 , r: 20 posisi x : 10 , y : 10 , w: 10 , h: 20 Me printed : {10 10} Me printed : {5 5} |
Kalau kita perhatikan diatas, perbedaan antara embeded struct dengan struct normal diantaranya :
- Saat mendeklarasi struct embeded kita tidak perlu mendeklarasi struct parent (struct yang kita embed) ke dalam variable. Dalam contoh struct circle, kita langsung mendeklarasikan posisi (tanpa variable p pada contoh yang sebelumnya)
- Saat mengakses posisi pada line 25, kita dapat langsung mengakses variable dari parent nya yaitu posisinya.
- Selain mengakses variable parent, kita juga dapat mengakses method dari parent. Seperti pada contoh parent (struct posisi) memiliki method dengan nama printMe. Dan kita bisa memanggil method tersebut dari struct yang mengembed posisi pada struct nya. Pada contoh ini ada pada line 28 dan 29, dimana kita bisa panggil method posisi dari struct circle dan rectangle
Inheritance ini digunakan jika kita memiliki beberapa struct dimana struct tersebut dapat sharing method ataupun variable, sehingga memungkinan untuk menulis kode lebih sedikit. Seperti pada contoh diatas untuk variable x, dan y tidak perlu dideklarasikan kembali pada struct circle dan rectangle karena sudah embed dengan struct posisi.