Go prizes one obvious way. Then an AI assistant trained on a planet of Java and Python writes code that compiles but reads like a C# port: swallowed errors, fat interfaces, goroutines nobody owns, and init() doing database calls on import. The fix isn't endless re-prompting — it's a .cursorrules file that tells Cursor and Claude Code what idiomatic Go actually looks like in your repo. Eight rules, each with a before and after. Drop them in and ship.
Rule 1: Errors are values — handle them, never discard
Never write `_ = someCall()` to ignore an error. Check every returned error and return with context via fmt.Errorf("%w", err). Sentinel errors use errors.Is; typed errors use errors.As.
Enter fullscreen mode
Exit fullscreen mode
Before
f , _ := os . Open ( path ) defer f . Close () data , _ := io . ReadAll ( f )
Enter fullscreen mode
Exit fullscreen mode
After
f , err := os . Open ( path ) if err != nil { return nil , fmt . Errorf ( "open %s: %w" , path , err ) } defer f .…