Omitempty

Struct tag “omitempty” digunakan dalam bahasa pemrograman Go untuk mengatur pengkodean data ke dalam format JSON. Struct tag ini memberikan instruksi kepada pemroses JSON untuk mengabaikan field struct jika nilainya kosong saat melakukan encoding.

Namun, ada beberapa masalah yang dapat muncul terkait dengan penggunaan struct tag “omitempty”. Salah satu masalahnya adalah ketika struct field yang bersifat opsional dan boleh tidak diisi ada dalam data request yang dikirim oleh klien. Dalam kasus ini, jika data tersebut tidak ada atau kosong, nilai default akan diisikan ke dalam field struct.

Sebagai contoh, jika kita memiliki struct Car seperti berikut:

type Car struct {
	Manufacturer string `json:"manufacturer"`
	Color        string `json:"color"`
}

Kemudian kita melakukan parsing JSON ke dalam struct menggunakan json.Unmarshal:

rawJSONCar := `
	{
		"manufacturer": "BMW"
	}
`

var car Car
err := json.Unmarshal([]byte(rawJSONCar), &car)
if err != nil {
	panic(err)
}

fmt.Printf("%+v", car)

Output yang dihasilkan akan menjadi:

$ go run main.go
{Manufacturer:BMW Color:}

Dalam contoh di atas, field “Manufacturer” terisi dengan nilai “BMW” karena data JSON yang dikirimkan oleh klien memiliki field tersebut. Namun, field “Color” terisi dengan nilai string kosong ("") karena data JSON tidak menyertakan field tersebut.

Untuk mengatasi masalah ini, kita dapat menggunakan struct tag “omitempty” pada field yang bersifat opsional, seperti berikut:

type Car struct {
	Manufacturer string `json:"manufacturer"`
	Color        string `json:"color,omitempty"`
}

Dengan menggunakan struct tag “omitempty”, field “Color” tidak akan ditampilkan dalam encoding JSON jika nilainya kosong. Jadi, jika kita melakukan encoding JSON dari struct Car seperti berikut:

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

carBytes, err := json.Marshal(car)
if err != nil {
	panic(err)
}

fmt.Println(string(carBytes))

Output yang dihasilkan akan menjadi:

$ go run main.go
{"manufacturer":"BMW"}

Seperti yang dapat dilihat, field “Color” tidak ditampilkan dalam JSON karena nilainya kosong.

Namun, jika kita mengisi nilai field “Color” dengan nilai yang tidak kosong, maka field tersebut akan ditampilkan dalam JSON:

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

carBytes, err := json.Marshal(car)
if err != nil {
	panic(err)
}

fmt.Println(string(carBytes))

Output yang dihasilkan akan menjadi:

$ go run main.go
{"manufacturer":"BMW","color":"Black"}

Dalam contoh ini, field “Color” ditampilkan dalam JSON karena nilainya tidak kosong.

Dengan menggunakan struct tag “omitempty”, kita dapat mengatur field-field struct yang bersifat opsional agar tidak ditampilkan dalam encoding JSON jika nilainya kosong. Hal ini memungkinkan kita untuk mengontrol tampilan data JSON sesuai dengan kebutuhan aplikasi.