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.
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.
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
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
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
.
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 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 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.