Di bahasa pemrograman Go, terdapat dua cara utama untuk menginisialisasi sebuah struct: secara langsung (explicit) dengan mengisi nilai field-nya, atau menggunakan fungsi constructor.

Sebagai contoh, misalkan kita memiliki struct berikut:

type Car struct {
	Manufacturer string
	Color        string
}

Inisialisasi Langsung

Kita dapat menginisialisasi struct secara langsung dengan mengisi field-field yang diinginkan:

car := Car{Manufacturer: "BMW", Color: "Red"}

Atau hanya sebagian field saja:

car := Car{Manufacturer: "BMW"}

Pada contoh di atas, field Color akan berisi nilai default (string kosong).

Inisialisasi dengan Constructor

Alternatif lain adalah menggunakan fungsi constructor, yaitu fungsi yang mengembalikan instance struct yang sudah terisi semua field-nya:

func NewCar(manufacturer string, color string) *Car {
	return &Car{
		Manufacturer: manufacturer,
		Color:        color,
	}
}

Penggunaan constructor:

car := NewCar("BMW", "Red")

Perbandingan dan Pertimbangan

Kedua cara di atas sama-sama valid, namun ada beberapa hal yang perlu dipertimbangkan:

  • Inisialisasi langsung memberikan fleksibilitas untuk mengisi sebagian field saja, namun berisiko ada field yang tidak terisi (bernilai nol/zero value).
  • Constructor memaksa semua field yang dianggap penting untuk diisi, sehingga lebih aman dari kesalahan pengisian data.

Contoh Masalah pada Inisialisasi Langsung

car := Car{Manufacturer: "BMW"}
fmt.Println(car)

Output:

{BMW }

Field Color kosong karena tidak diisi.

Contoh Error pada Constructor

Jika menggunakan constructor dan tidak mengisi semua parameter:

car := NewCar("BMW") // field "Color" tidak diisi

Akan muncul error saat kompilasi:

./main.go:20:16: not enough arguments in call to NewCar
	have (string)
	want (string, string)

Kapan Menggunakan Constructor?

  • Gunakan constructor jika:
    • Ada field yang wajib diisi agar struct valid.
    • Zero value pada struct tidak masuk akal atau bisa menyebabkan bug.
    • Ingin membatasi akses langsung ke field tertentu (misal: field privat).
  • Inisialisasi langsung cukup jika:
    • Zero value pada struct aman dan masuk akal.
    • Struct sederhana dan tidak ada aturan khusus dalam pengisiannya.

Kesimpulan

Gunakan pendekatan yang paling sesuai dengan kebutuhan desain struct Anda. Constructor memberikan keamanan dan kejelasan, sedangkan inisialisasi langsung memberikan fleksibilitas. Pertimbangkan kebutuhan validasi dan keamanan data saat memilih metode inisialisasi.