# Go Patterns Cheat Sheet ## Defer - Cleanup Pattern ```go initDB() defer db.Close() // Runs when function exits, no matter how ``` - Schedules function to run when surrounding function returns - Executes in LIFO order if multiple defers - Great for resource cleanup (files, connections, etc.) ## Formatted Output to HTTP ```go fmt.Fprintf(w, "%d", rng.Intn(1000)) ``` - `fmt.Fprintf` = formatted print to a writer (not stdout) - `w` = HTTP response writer - `%d` = format placeholder for integers - Alternative: `fmt.Fprint(w, value)` for no formatting ## Ticker + Select for Scheduled Tasks ```go func startMiningTicker() { ticker := time.NewTicker(1 * time.Minute) defer ticker.Stop() for { select { case <-ticker.C: updateMiningValue() } } } ``` - `time.NewTicker()` creates repeating timer - `select` waits for channel events - `<-ticker.C` receives from ticker's channel - Common pattern for background jobs ## Database Scanning into Structs ```go type MiningRecord struct { ID int `json:"id"` Timestamp time.Time `json:"timestamp"` Value float64 `json:"value"` Rate float64 `json:"rate"` } var latest MiningRecord err := db.QueryRow("SELECT id, timestamp, value, rate FROM mining ORDER BY timestamp DESC LIMIT 1"). Scan(&latest.ID, &latest.Timestamp, &latest.Value, &latest.Rate) ``` - `Scan()` copies SQL results into Go variables - Order matters: first column → first Scan argument - Use `&` to pass addresses so Scan can write to them - Struct tags (`json:"id"`) control JSON serialization ## Blank Identifier for Ignoring Values ```go _, err = db.Exec("INSERT INTO mining (timestamp, value, rate) VALUES (?, ?, ?)", now, newValue, latest.Rate) ``` - `_` = blank identifier, discards unwanted return values - `db.Exec()` returns `(sql.Result, error)` - We only care about the error, so ignore the Result - Go requires this instead of leaving variables unused ## HTTP Handler Pattern ```go func handler(w http.ResponseWriter, r *http.Request) { // w = where response goes // r = incoming request data fmt.Fprintf(w, "response") } ``` - `w` writes back to client - `r` contains request info - Common to use `fmt.Fprintf(w, ...)` for simple responses