Struct

Pada sesi ini akan di bahas apa itu Struct pada Go

Go tidak memiliki class seperti 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 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.

Konsep struct di GO mirip dengan konsep class pada OOP, meski sebenarnya berbeda

Dengan memanfaatkan struct, grouping data akan lebih mudah dan tidak sulit untuk di-maintain.

Keyword type digunakan untuk mendeklarasikan sebuah struct:

type Person struct {
    Name string
    Age int
}
package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func main() {
	fmt.Println(Person{"David", 26})
}

Pada kode di atas kita membuat sebuah struct bernama person yang berisi property name dengan tipe string dan age dengan tipe int .

Membuat Instance dan Mengakses Object Struct

Kita dapat melakukan inisialisasi object dari struct dengan cara menambahkan tanda kurung kurawal {} setelah nama struct seperti berikut ini:

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func main() {
	p1 := Person{}
	p1.Name = "David Winalda"
	p1.Age = 26

	fmt.Println(p1.Name)
	fmt.Println(p1.Age)
}

Pada kode di atas kita membuat sebuah instance dari struct yaitu p1 yang diassign dengan data yang diinginkan. Lalu untuk mengakses properti dari struct, gunakan . pada nama struct atau instance dari struct. Output program di atas adalah sebagi berikut:

Kita juga bisa langsung mengisi nilai dari instance struct pada saat inisiasi seperti berikut ini dengan catatan urutan nilai harus sama dengan urutan property atau method yang di daftarkan.

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func main() {
	p1 := Person{"David Winalda", 26}

	fmt.Println(p1.Name)
	fmt.Println(p1.Age)
}

atau

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func main() {
	p1 := Person{Age: 26, Name: "David Winalda"}

	fmt.Println(p1.Name)
	fmt.Println(p1.Age)
}

untuk cara di atas tidak perlu mengisi nilai struct secara terurut.

Embedded Struct

Embedded struct adalah menggunakan sebuah struct sebagai properti pada struct lain.

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

type Student struct {
	Person
	Batch string
}

func main() {
	s1 := Student{}

	s1.Name = "David Winalda"
	s1.Age = 27
	s1.Batch = "Batch 1"

	fmt.Println(s1.Name)
	fmt.Println(s1.Age)
	fmt.Println(s1.Batch)
}

Pada kode di atas kita membuat 2 buat struct yaitu person dan student . Struct pada student memiliki properti person yang juga merupakan sebuah struct .

Embedded struct bersifat mutable, nilai property-nya nya bisa diubah.

Khusus untuk properti yang bukan properti asli (properti turunan dari struct lain), bisa diakses dengan cara mengakses struct parent-nya terlebih dahulu, contohnya s1.person.batch. Nilai yang dikembalikan memiliki referensi yang sama dengan s1.batch.

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

type Student struct {
	Person
	Batch string
}

func main() {
	s1 := Student{}

	s1.Name = "David Winalda"
	s1.Age = 27
	s1.Batch = "Batch 1"

	fmt.Println(s1.Name)
	fmt.Println(s1.Age)
	fmt.Println(s1.Person.Age) // Mengakses properti dari struct person
	fmt.Println(s1.Batch)
}

Embedded Struct Dengan Nama Property Yang Sama

Jika salah satu nama properti sebuah struct memiliki kesamaan dengan properti milik struct lain yang di-embed, maka untuk mengakses property-nya harus dilakukan secara eksplisit atau jelas.

package main

import "fmt"

type Person struct {
	Name   string
	Age    int
	Alamat string
}

type Student struct {
	Person
	Batch  string
	Alamat string
}

func main() {
	s1 := Student{}

	s1.Name = "David Winalda"
	s1.Age = 27
	s1.Batch = "Batch 1"

	s1.Person.Alamat = "Jalan original person s1"
	s1.Alamat = "Jalan alternatif person s1"

	fmt.Println(s1.Name)
	fmt.Println(s1.Age)
	fmt.Println(s1.Person.Alamat)
	fmt.Println(s1.Alamat)
}

Anonymous Struct

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

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func main() {
	s1 := struct {
		Person
		Batch string
	}{}

	s1.Name = "David Winalda"
	s1.Age = 27
	s1.Batch = "Batch 1"

	fmt.Println(s1.Name)
	fmt.Println(s1.Age)
	fmt.Println(s1.Batch)
}

Last updated