diff --git a/go-cheatsheet.md b/go-cheatsheet.md new file mode 100644 index 0000000..ecf5bd0 --- /dev/null +++ b/go-cheatsheet.md @@ -0,0 +1,77 @@ +# 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