Table of Contents

06 – Struct

Pengenalan

Go tidak memiliki class yang ada di bahasa-bahasa strict OOP lain. Tapi Go memiliki tipe data struktur yang disebut dengan Struct.

Struct adalah kumpulan definisi variabel (atau property) dan atau fungsi (atau method), yang dibungkus sebagai tipe data baru dengan nama tertentu. Property dalam struct, tipe datanya bisa bervariasi. Mirip seperti map, hanya saja key-nya sudah didefinisikan di awal, dan tipe data tiap itemnya bisa berbeda.

Dari sebuah struct, kita bisa buat variabel baru, yang memiliki atribut sesuai skema struct tersebut. Kita sepakati dalam buku ini, variabel tersebut dipanggil dengan istilah object atau object struct.

Deklarasi Struct

Keyword type digunakan untuk deklarasi struct. Di bawah ini merupakan contoh cara penggunaannya.

				
					type student struct {
    name string
    grade int
}
				
			

Struct student dideklarasikan memiliki 2 property, yaitu name dan grade. Objek yang dibuat dengan struct ini nantinya memiliki skema atau struktur yang sama.

Penerapan Struct

Struct student yang sudah disiapkan di atas akan kita manfaatkan untuk membuat variabel objek. Property variabel tersebut di-isi kemudian ditampilkan.

				
					package main

import "fmt"

func main() {
	var s1 student
	s1.name = "john wick"
	s1.grade = 2

	fmt.Println("name  :", s1.name)
	fmt.Println("grade :", s1.grade)
}

type student struct {
	name  string
	grade int
}

				
			
				
					name  : john wick
grade : 2
				
			
Embbed Struct

Embedded struct adalah mekanisme untuk menempelkan sebuah struct sebagai properti struct lain. Agar lebih mudah dipahami, mari kita bahas kode berikut.

				
					package main

import "fmt"

type person struct {
    name string
    age  int
}

type student struct {
    grade int
    person
}

func main() {
    var s1 = student{}
	s1.name = "wick"
	s1.age = 21
	s1.grade = 2

	fmt.Println("name  :", s1.name)
	fmt.Println("age   :", s1.age)
	fmt.Println("age   :", s1.person.age)
	fmt.Println("age   :", s1.person.name)
	fmt.Println("grade :", s1.grade)
}
				
			
				
					name  : wick
age   : 21
age   : 21
age   : wick
grade : 2
				
			
Pengisian Nilai Sub-Struct

Perhatikan s1.name dan s1.person.name pada contoh sebelumnya, sub struct dapat langsung dipanggil tanpa harus menyebutkan substructnya kecuali jika struct utama dan sub struct terdapat properties yang sama misal seperti di bawah ini.

				
					package main

import "fmt"

type person struct {
    name string
    age  int
}

type student struct {
    person
    age   int
    grade int
}

func main() {
    var s1 = student{}
    s1.name = "wick"
    s1.age = 21        // age of student
    s1.person.age = 22 // age of person

    fmt.Println(s1.name)
    fmt.Println(s1.age)
    fmt.Println(s1.person.age)
}
				
			

Struct person di-embed ke dalam struct student, dan kedua struct tersebut kebetulan salah satu nama property-nya ada yang sama, yaitu age. Cara mengakses property age milik struct person lewat objek struct student, adalah dengan menuliskan nama struct yang di-embed kemudian nama property-nya, contohnya: s1.person.age = 22.

Kombinasi Slice & Struct

Slice dan struct bisa dikombinasikan seperti pada slice dan map, caranya penggunaannya-pun mirip, cukup tambahkan tanda [] sebelum tipe data pada saat deklarasi.

				
					type person struct {
    name string
    age  int
}

var allStudents = []person{
    {name: "Wick", age: 23},
    {name: "Ethan", age: 23},
    {name: "Bourne", age: 22},
}

for _, student := range allStudents {
    fmt.Println(student.name, "age is", student.age)
}
				
			
				
					Wick age is 23
Ethan age is 23
Bourne age is 22
				
			
Anonymous Struct

Anonymous struct adalah struct yang tidak dideklarasikan di awal sebagai tipe data baru, melainkan langsung ketika pembuatan objek. Teknik ini cukup efisien untuk pembuatan variabel objek yang struct-nya hanya dipakai sekali.

				
					package main

import "fmt"

type person struct {
    name string
    age  int
}

func main() {
    var s1 = struct {
        person
        grade int
    }{}
    s1.person = person{"wick", 21}
    s1.grade = 2

    fmt.Println("name  :", s1.person.name)
    fmt.Println("age   :", s1.person.age)
    fmt.Println("grade :", s1.grade)
}
				
			

Salah satu aturan yang perlu diingat dalam pembuatan anonymous struct adalah, deklarasi harus diikuti dengan inisialisasi. Bisa dilihat pada s1 setelah deklarasi struktur struct, terdapat kurung kurawal untuk inisialisasi objek. Meskipun nilai tidak diisikan di awal, kurung kurawal tetap harus ditulis.

Untuk model Slice penulisan Anonymous ditulis dengan cara seperti di bawah ini.

				
					var allStudents = []struct {
    person
    grade int
}{
    {person: person{"wick", 21}, grade: 2},
    {person: person{"ethan", 22}, grade: 3},
    {person: person{"bond", 21}, grade: 3},
}

for _, student := range allStudents {
    fmt.Println(student)
}
				
			

dan untuk Nested yang lebih rumit.

				
					type student struct {
    person struct {
        name string
        age  int
    }
    grade   int
    hobbies []string
}
				
			
Tag property dalam struct

Tag merupakan informasi opsional yang bisa ditambahkan pada masing-masing property struct.

				
					type person struct {
    name string `name`
    age  int    `age`
}
				
			

Tag biasa dimanfaatkan untuk keperluan encode/decode data json. Informasi tag juga bisa diakses lewat reflect. Nantinya akan ada pembahasan yang lebih detail mengenai pemanfaatan tag dalam struct, terutama ketika sudah masuk chapter JSON.