Type Assertions Pada Golang
Short Story
Ketika aku ngoding golang di projek kantor, aku nemuin kode yang cukup asing sebelumnya pada template boilerplatenya. Kurang lebih kaya gini nih:
func (contoh *contohUseCase) GetContoh(contohDTO dto.IContohDTO) (*entities.Contoh, error) {
getContoh, _ := contohDTO.(*dto.GetContoh)
}
Wait, apa nih contohDTO.(*dto.GetContoh) ? nemu .() yang mana merupakan hal asing di Javascript 🙌
Setelah, kesana-kemari mencari referensi. Akhirnya nemu pencerahan di Dokumentasinya golang. Yak, namanya type assertions. Apakah itu 🧑🔬
Gampangannya type assertions itu pemberian tipe pada sebuah variabel yang bertype interface. Karena golang adalah salah satu bahasa pemrograman yang strong strict type, maka kalo ada tipedata yang sekiranya lemparannya belum diketahui maka dibuatlah tipe data interface, ini kalo di typescript analoginya adalah generic<\T>.
Contohnya seperti di parameter method GetContoh() di atas tadi, yg mana lemparan variabel contohDTO sebelumnya harus melakukan pemanggilan function sesuai dengan interfacenya. Atau kurang lebih kaya gini:
// Misal Interfacenya
type IContohDTO interface {
Validate() error
}
// Maka sebelum memanggil GetContoh, contohDTO harus panggil Validate() jadinya
contohDTO, _ := req.Validate(r)
handler.usecase.GetContoh(contohDTO)
Nah, variable contohDTO ini kan masih belom jelas, dia punya function atau properties apa. Makannya dia dikasih type assertions (*dto.GetContoh) yang berarti contentDTO ini bertype struct GetContoh{}. Kalo ga gitu nanti contohDTO gabisa diapai-apain ges, karena gajelas typenya. Untuk contoh sederhana dr konsep ini bisa dilihat dibawah ini:
var x interface{} = 7 // x has dynamic type int and value 7
i := x.(int) // i has type int and value 7
type I interface { m() }
func f(y I) {
s := y.(string) // illegal: string does not implement I (missing method m)
r := y.(io.Reader) // r has type io.Reader and the dynamic type of y must implement both I and io.Reader
…
}
Sekian, semoga bermanfaat ya 😀
Comments