🔗 HTTP router based on radix trees.
Find a file
2023-07-29 17:00:10 +02:00
testdata Added Router type 2023-07-09 21:24:24 +02:00
.editorconfig Improved struct alignment 2023-07-29 17:00:10 +02:00
.gitignore Added tests and benchmarks 2023-07-09 17:46:17 +02:00
Benchmarks_test.go Added Router type 2023-07-09 21:24:24 +02:00
go.mod Changed generic type constraint 2023-07-18 17:14:34 +02:00
go.sum Changed generic type constraint 2023-07-18 17:14:34 +02:00
LICENSE Added basic routing 2023-07-09 12:42:33 +02:00
Parameter.go Added tests and benchmarks 2023-07-09 17:46:17 +02:00
README.md Improved documentation 2023-07-18 11:13:58 +02:00
Router.go Changed generic type constraint 2023-07-18 17:14:34 +02:00
Router_test.go Improved route order flexibility 2023-07-10 14:48:28 +02:00
Tree.go Improved struct alignment 2023-07-29 17:00:10 +02:00
treeNode.go Improved struct alignment 2023-07-29 17:00:10 +02:00

router

HTTP router based on radix trees.

Installation

go get git.akyoto.dev/go/router

Usage

Static

We can save any type of data inside the router. Here is an example storing strings for static routes:

router := router.New[string]()

router.Add("GET", "/hello", "Hello")
router.Add("GET", "/world", "World")

Parameters

The router supports parameters:

router.Add("GET", "/users/:id", "...")
router.Add("GET", "/users/:id/comments", "...")

Wildcards

The router can also fall back to a catch-all route which is useful for file servers:

router.Add("GET", "/images/*path", "...")

Benchmarks

Requesting every single route in github.txt (≈200 requests) in each iteration:

BenchmarkLookup-12                 33210             36134 ns/op           19488 B/op        337 allocs/op
BenchmarkLookupNoAlloc-12         103437             11331 ns/op               0 B/op          0 allocs/op

Embedding

If you'd like to embed this router into your own framework, please use LookupNoAlloc because it's much faster than Lookup.

To build an http server you would of course store request handlers (functions), not strings.