Struct adalah composite type, digunakan ketika kita ingin mendefinisikan sebuah entitas dengan sejumlah properti (fields) di dalamnya. Field memiliki nama dan tipe data tersendiri, nama field dalam struct tidak boleh sama.
1. Pendefinisian
Tipe data field pada struct bisa berupa tipe data apapun bahkan struct itu sendiri, fungsi dan juga interface, sedangkan nama fieldnya harus unik. Adapun format penulisan yang umum seperti berikut ini:
type identifier struct{
field1 type1
field2 type2
_ type3
...dst
}
Jika kita ingin membuat field pada struct yang tidak ingin kamu gunakan di dalam kode atau tidak ingin membaca data di dalamnya, kita bisa menggunakan nama _
.
Pendeklarasian
Karena struct adalah sebuah nilai, maka kita bisa mendeklarasikan variabel dengan type struct dan menginisialisasi (memberikan nilai) pada setiap field menggunakan dot-notation seperti berikut:
var namaVariabel namaStruct
namaVariabel.field1 = "text"
namaVariabel.field2 = 5
Inisialisasi
Inisialisasi struct bisa menggunakan fungsi new()
. Kemudian pemberian nilai setiap field menggunakan dot-notation seperti contoh berikut:
var mystruct *Pelajar
mystruct = new(Pelajar)
mystruct.Nama = "Alan"
mystruct.Umur = 22
Untuk penulisan yang lebih pendeknya bisa juga ditulis var mystruct *Pelajar = new(Pelajar)
atau mystruct:=new(Pelajar)
. Memori pada struct baru dialokasikan menggunakan fungsi new()
, variabel mystruct
merupakan sebuah pointer ke Pelajar
dengan nilai fieldnya berisi nilai kosong (zero-values) berdasarkan tipe datanya.
Contoh kode program struct
package main
import "fmt"
type Produk struct {
Nama string
Harga float32
Jumlah int
}
func main() {
var p0 Produk
p1 := new(Produk)
fmt.Println("Hasil dekslarasi p0 = ", p0)
fmt.Println("Hasil dekslarasi p1 = ", p1)
p1.Nama = "Kaos Polos"
p1.Harga = 15000
p1.Jumlah = 50
fmt.Printf("Nama Produk : %s\n", p1.Nama)
fmt.Printf("Harga Produk : %f\n", p1.Harga)
fmt.Printf("Jumlah Stok : %d\n", p1.Jumlah)
fmt.Println("Hasil inisialisasi p1 : ", p1)
//salin inisialisasi p1
p0 = *p1
fmt.Println("Hasil inisialisasi p0 : ", p0)
}
Hasil Output:
Hasil dekslarasi p0 = { 0 0}
Hasil dekslarasi p1 = &{ 0 0}
Nama Produk : Kaos Polos
Harga Produk : 15000.000000
Jumlah Stok : 50
Hasil inisialisasi p1 : &{Kaos Polos 15000 50}
Hasil inisialisasi p0 : {Kaos Polos 15000 50}
Dari contoh diatas kita bisa melihat bahwa setelah variabel tersebut dideklarakasikan, nilai inisialisasi berupa zero-value
. bedanya dengan new()
kita menggunakan variabel tersebut sebagai pointer.
Ada pula cara yang lebih pendek untuk menginisialisasi struct (struct-literal) seperti berikut:
p1:=&Produk{"Kaos Polos",15000,50}
// p1 adalah pointer type *Produk
//atau
var p2 Produk
p1=Produk{"Kaos Polos",15000,50}
Sintak literal &Produk{"Kaos Polos",15000,50}
adalah cara yang lebih simpel. Namun sebenarnya tetap menggunakan fungsi new()
di background. Jadi menggunakan new(Produk)
dan &Produk{}
merupakan ekspresi yang sama.