Today I Learned: Shadowed Variables can create Race Condition [Go]

harun nur rasyid
2 min readMar 19, 2021

Sedikit cerita hari ini gua dapet sebuah task yang mengharuskan gua untuk membaca 1042 baris lebih kode Go Lang hingga menghabiskan 1 bungkus roko & 1 gelas kopi ditambah permen milkita #candaPermenMilkita ☕️. Nah uNiQue -nya setiap kali gua baca, gak cuma mumet aja yg didapet, pun ada hal menarik yang bisa gua pelajarin dan gua tanyain ke sepuh-sepuh disini bhahaha.

gambar 1.0

Oke sudah cukup basa basinya, mari kita mulai! Nah ketika gua baca baris perbaris source code service tersebut, gua menemukan sebuah keanehan #anjayMabar! Gak deeeeng wakakaka😆 gua nemuin, satu baris kode yang kasih warning loop variable capture by func literal . Naaaah apaan tuh 😰

Setelah gua perhatikan, ternyata ada sebuah goroutine yang dijalankan berulang kali alias looping, oke anggap saja kodenya dibawah ini.

Ekspektasinya adalah, akan ada 5 buah goroutine yang berjalan sehingga akan ada 5 buah output berbeda

Tapi pada kenyataannya output yang dikeluarkan adalah seperti berikut. Terlihat seperti hanya ada satu buah goroutine saja yang di proses 😟

Okeee gak perlu khawatir, ternyata solusinya sederhana bangettt! kita cukup passing variable d alias donation ke anonymous function goroutine tersebut, seperti ini.

Selesaiii, akhirnya masalahnya terselesaikan 😆

Penutup

Dikutip dari Stackoverflow Don’t feel bad it’s a common mistake for new comers in Go, and yes the var d changes for each loop, so your goroutines will use the last process in the slice donations, all you have to do is pass the variable as a parameter to the anonymous function

--

--

harun nur rasyid

Software Engineer — Writer — Open Source Enthusiast — Startup Enthusiast :)