56,966 blogs · [ { "id": "01a08724-0b3a-7112-9f35-8e4936c647a9", "title": "How I use HTMX with Go", "url": "https://www.alexedwards.net/blog/how-i-use-htmx-with-go", "published_at": "2026-07-14T11:20:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493766ee07", "title": "Go Experiments Explained", "url": "https://www.alexedwards.net/blog/go-experiments-explained", "published_at": "2026-06-01T08:01:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e4937c6f59e", "title": "Go Naming Conventions: A Practical Guide", "url": "https://www.alexedwards.net/blog/go-naming-conventions", "published_at": "2026-03-24T11:21:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493830aee4", "title": "A modern approach to preventing CSRF in Go", "url": "https://www.alexedwards.net/blog/preventing-csrf-in-go", "published_at": "2025-10-14T14:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e49390faa00", "title": "The 9 Go test assertions I use (and why)", "url": "https://www.alexedwards.net/blog/the-9-go-test-assertions-i-use", "published_at": "2025-08-22T18:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493973eea1", "title": "How to manage configuration settings in Go web applications", "url": "https://www.alexedwards.net/blog/how-to-manage-configuration-settings-in-go-web-applications", "published_at": "2025-06-30T16:30:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e4939d6f36d", "title": "Organize your Go middleware without dependencies", "url": "https://www.alexedwards.net/blog/organize-your-go-middleware-without-dependencies", "published_at": "2025-04-26T10:30:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493a0e257e", "title": "When is it OK to panic in Go?", "url": "https://www.alexedwards.net/blog/when-is-it-ok-to-panic-in-go", "published_at": "2025-03-31T23:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493a549e27", "title": "How to manage tool dependencies in Go 1.24+", "url": "https://www.alexedwards.net/blog/how-to-manage-tool-dependencies-in-go-1.24-plus", "published_at": "2025-02-20T20:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493aa3c8b5", "title": "Eleven tips for structuring your Go projects", "url": "https://www.alexedwards.net/blog/11-tips-for-structuring-your-go-projects", "published_at": "2025-01-22T11:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493b2c4cf1", "title": "Implementing an in-memory cache in Go", "url": "https://www.alexedwards.net/blog/implementing-an-in-memory-cache-in-go", "published_at": "2023-12-22T11:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493ba04be7", "title": "Demystifying function parameters in Go", "url": "https://www.alexedwards.net/blog/demystifying-function-parameters-in-go", "published_at": "2023-11-08T10:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493c9beb80", "title": "A time-saving Makefile for your Go projects", "url": "https://www.alexedwards.net/blog/a-time-saving-makefile-for-your-go-projects", "published_at": "2023-05-02T17:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493d347980", "title": "How to use the http.ResponseController type", "url": "https://www.alexedwards.net/blog/how-to-use-the-http-responsecontroller-type", "published_at": "2023-03-07T12:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493d3772cf", "title": "An introduction to Packages, Imports and Modules in Go", "url": "https://www.alexedwards.net/blog/an-introduction-to-packages-imports-and-modules", "published_at": "2023-02-01T14:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493dda488d", "title": "A complete guide to working with Cookies in Go", "url": "https://www.alexedwards.net/blog/working-with-cookies-in-go", "published_at": "2022-09-28T13:30:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493e36ee59", "title": "The 'fat service' pattern for Go web applications", "url": "https://www.alexedwards.net/blog/the-fat-service-pattern", "published_at": "2022-08-08T10:15:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493e4b840d", "title": "Flow: A tiny but powerful HTTP router for Go", "url": "https://www.alexedwards.net/blog/introducing-flow", "published_at": "2022-05-25T08:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e493f3e8ba4", "title": "How to use go run to manage tool dependencies", "url": "https://www.alexedwards.net/blog/using-go-run-to-manage-tool-dependencies", "published_at": "2022-05-10T12:25:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e4940072e07", "title": "Easy test assertions with Go generics", "url": "https://www.alexedwards.net/blog/easy-test-assertions-with-go-generics", "published_at": "2022-04-03T10:25:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e49408bcf6b", "title": "Continuous integration with Go and GitHub Actions", "url": "https://www.alexedwards.net/blog/ci-with-go-and-github-actions", "published_at": "2021-12-06T09:25:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e4940fcfdbc", "title": "Change URL query params in Go", "url": "https://www.alexedwards.net/blog/change-url-query-params-in-go", "published_at": "2021-11-28T10:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e4941b48055", "title": "Which Go router should I use?", "url": "https://www.alexedwards.net/blog/which-go-router-should-i-use", "published_at": "2021-10-04T17:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e49420fd1a6", "title": "I18n in Go: Managing translations", "url": "https://www.alexedwards.net/blog/i18n-managing-translations", "published_at": "2021-08-25T17:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e4942d507ec", "title": "How to correctly use Basic Authentication in Go", "url": "https://www.alexedwards.net/blog/basic-authentication-in-go", "published_at": "2021-06-21T16:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e494311cd87", "title": "Custom command-line flags with flag.Func", "url": "https://www.alexedwards.net/blog/custom-command-line-flags", "published_at": "2021-03-08T16:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e4943671485", "title": "Surprises and gotchas when working with JSON", "url": "https://www.alexedwards.net/blog/json-surprises-and-gotchas", "published_at": "2020-09-24T16:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e49444d0a66", "title": "How to manage database timeouts and cancellations in Go", "url": "https://www.alexedwards.net/blog/how-to-manage-database-timeouts-and-cancellations-in-go", "published_at": "2020-04-20T12:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e49446de4b3", "title": "How to parse a JSON request body in Go", "url": "https://www.alexedwards.net/blog/how-to-properly-parse-a-json-request-body", "published_at": "2019-10-21T20:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e49448e37d9", "title": "Golang Interfaces explained", "url": "https://www.alexedwards.net/blog/interfaces-explained", "published_at": "2019-08-07T14:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e494575263a", "title": "Using PostgreSQL JSONB with Go", "url": "https://www.alexedwards.net/blog/using-postgresql-jsonb", "published_at": "2019-05-14T12:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e49461f0c0b", "title": "An overview of Go's tooling", "url": "https://www.alexedwards.net/blog/an-overview-of-go-tooling", "published_at": "2019-04-15T18:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e494666f45f", "title": "How to hash and verify passwords with Argon2 in Go", "url": "https://www.alexedwards.net/blog/how-to-hash-and-verify-passwords-with-argon2-in-go", "published_at": "2018-12-10T18:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e494726bd39", "title": "Streamline your Sublime Text + Go workflow", "url": "https://www.alexedwards.net/blog/streamline-your-sublime-text-and-go-workflow", "published_at": "2018-06-05T13:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e4947650f5b", "title": "HTTP Method spoofing in Go", "url": "https://www.alexedwards.net/blog/http-method-spoofing", "published_at": "2018-05-10T16:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e4948538879", "title": "How to build a Serverless API with Go and AWS Lambda", "url": "https://www.alexedwards.net/blog/serverless-api-with-go-and-aws-lambda", "published_at": "2018-04-10T12:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e4948b36752", "title": "How to disable http.FileServer directory listings", "url": "https://www.alexedwards.net/blog/disable-http-fileserver-directory-listings", "published_at": "2018-03-14T18:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e494986205c", "title": "Configuring sql.DB for better performance", "url": "https://www.alexedwards.net/blog/configuring-sqldb", "published_at": "2018-02-05T17:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e4949e9259e", "title": "How to rate limit HTTP requests in Go", "url": "https://www.alexedwards.net/blog/how-to-rate-limit-http-requests", "published_at": "2017-12-28T17:00:00+00:00" }, { "id": "01a08724-0b3a-7112-9f35-8e4949fc6517", "title": "Validation snippets for Go", "url": "https://www.alexedwards.net/blog/validation-snippets-for-go", "published_at": "2017-08-05T19:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-285180d4fb39", "title": "SCS: A session manager for Go web applications 1.7+", "url": "https://www.alexedwards.net/blog/scs-session-manager", "published_at": "2016-08-30T18:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-28518113427b", "title": "Working with Redis", "url": "https://www.alexedwards.net/blog/working-with-redis", "published_at": "2016-02-26T19:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-285181167724", "title": "Organising database access in Go", "url": "https://www.alexedwards.net/blog/organising-database-access", "published_at": "2015-07-16T23:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-285181515269", "title": "Practical Persistence in Go: SQL Databases", "url": "https://www.alexedwards.net/blog/practical-persistence-sql", "published_at": "2015-06-13T20:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-2851824bc4fb", "title": "Context-aware Handler chains", "url": "https://www.alexedwards.net/blog/handler-chains-using-stack", "published_at": "2014-12-03T22:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-28518347635d", "title": "Making and using HTTP Middleware in Go", "url": "https://www.alexedwards.net/blog/making-and-using-middleware", "published_at": "2014-10-21T20:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-285183be179e", "title": "Simple 'flash' messages in Go", "url": "https://www.alexedwards.net/blog/simple-flash-messages-in-golang", "published_at": "2013-11-19T18:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-2851847580c5", "title": "Form validation and processing in Go", "url": "https://www.alexedwards.net/blog/form-validation-and-processing", "published_at": "2013-11-01T23:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-28518479b12c", "title": "HTTP Response Snippets for Go", "url": "https://www.alexedwards.net/blog/golang-response-snippets", "published_at": "2013-10-19T12:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-285184bd314d", "title": "Understanding Mutexes", "url": "https://www.alexedwards.net/blog/understanding-mutexes", "published_at": "2013-10-04T20:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-285185b29843", "title": "Automatic code reloading in Go", "url": "https://www.alexedwards.net/blog/golang-automatic-reloads", "published_at": "2013-09-20T22:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-285185c9a5c2", "title": "An introduction to Handlers and Servemuxes in Go", "url": "https://www.alexedwards.net/blog/an-introduction-to-handlers-and-servemuxes-in-go", "published_at": "2013-09-12T19:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-285186acc79c", "title": "Serving static sites with Go", "url": "https://www.alexedwards.net/blog/serving-static-sites-with-go", "published_at": "2013-08-24T12:00:00+00:00" }, { "id": "01a08724-0b3b-72bd-91a4-2851876cc58d", "title": "A fresh start", "url": "https://www.alexedwards.net/blog/cleaner-better-faster", "published_at": "2013-08-17T12:00:00+00:00" } ] posts Claim your blog
Back to alexedwards.net
Blog · corpus.blog/blogs/alexedwards.net/posts

alexedwards.net

alexedwards.net

2026

2025

2023

2022

2021

2020

2019

2018

2017

2016

2015

2014

2013