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.