@@ -197,6 +197,27 @@ concepts:
197197 hints :
198198 - Use `select` to handle multiple channel operations concurrently.
199199 - Use `time.After` to simulate a 5 microsecond timeout.
200+ - slug : 41_time_delay
201+ title : " Delays and Timers in Go"
202+ difficulty : beginner
203+ topics : ["time", "sleep", "channels", "timer"]
204+ test_regex : " .*"
205+ hints :
206+ - " Use time.Sleep() to pause execution for a duration."
207+ - " Convert milliseconds to time.Duration using time.Millisecond."
208+ - " Use a buffered channel to send a signal after waiting."
209+ - " Use time.After or time.Sleep to trigger events after delays."
210+ - slug : 42_wait_group
211+ title : WaitGroups
212+ test_regex : " .*"
213+ difficulty : beginner
214+ topics : ["concurrency", "sync", "goroutines"]
215+ hints :
216+ - " Use sync.WaitGroup to wait for all launched goroutines."
217+ - " Call wg.Add(1) before starting a goroutine and wg.Done() when it finishes."
218+ - " Close result channels after wg.Wait() so collectors can range over them."
219+ - " Capture loop variables correctly inside goroutines (e.g., `n := n`)."
220+ - " Return results as a slice — order does not need to match input order
200221projects:
201222- slug: 101_text_analyzer
202223 title: Text Analyzer (Easy)
@@ -276,6 +297,30 @@ projects:
276297 - " Use time.LoadLocation() to work with different timezones"
277298 - " Extract time components using .Date() and .Clock() methods"
278299
300+ - slug : 39_panic
301+ title : Panic and Recover
302+ test_regex : " .*"
303+ hints :
304+ - " Use `panic()` to simulate runtime errors when appropriate."
305+ - " Use `defer` with `recover()` to catch and handle panics."
306+ - " Recovering from panics allows graceful handling of unexpected situations."
307+ - " Remember: `recover()` only works inside a deferred function."
308+
309+ - slug : 64_timers
310+ title : " Timers"
311+ difficulty : medium
312+ topics : ["time", "goroutines", "concurrency", "synchronization"]
313+ test_regex : " .*"
314+ hints :
315+ - " Use a map[string]*time.Timer to track active timers by key."
316+ - " Use a mutex to safely access the timers map concurrently."
317+ - " Start a timer with time.AfterFunc(d, fn) to run a callback after duration d."
318+ - " If Start is called again for an existing key, stop and replace the old timer."
319+ - " Stop should remove the timer from the map and prevent the callback from firing."
320+ - " Reset can call timer.Reset(d) to reschedule the same callback."
321+ - " Remember to remove timers from the map after they fire to avoid memory leaks."
322+ - " Write tests to verify Start, Stop, and Reset behavior, including concurrency scenarios."
323+
279324- slug : 68_rate_limiting
280325 title : Rate Limiting
281326 test_regex : " .*"
@@ -288,4 +333,4 @@ projects:
288333 - " Reset should clear the request history for a key; if the key does not exist, do nothing."
289334 - " Consider edge cases: multiple keys, concurrent access, and requests exactly at the interval boundary."
290335 - " In tests, use time.Sleep with a small buffer above the interval to avoid flakiness."
291- - " Initialize the timestamps map in NewRateLimiter to prevent nil pointer errors."
336+ - " Initialize the timestamps map in NewRateLimiter to prevent nil pointer errors."
0 commit comments