90 lines
2.3 KiB
Markdown
90 lines
2.3 KiB
Markdown
# Router
|
|
|
|
A high-performance router for Go with support for path parameters and wildcards. Sports an incredibly simple API over the top of a prefix tree data structure. Minimal allocations and, dare we say, 🔥*blazingly* fast🔥.
|
|
|
|
## Features
|
|
- Zero dependencies
|
|
- Fast path matching with radix tree structure
|
|
- Support for path parameters (`[id]`) and wildcards (`*path`)
|
|
- Up to 15x faster than `http.ServeMux` for dynamic routes
|
|
- Zero allocations for static routes
|
|
|
|
## Installation
|
|
|
|
```shell
|
|
go get git.sharkk.net/Go/Router
|
|
```
|
|
|
|
## Usage
|
|
|
|
```go
|
|
type Handler func(params []string)
|
|
|
|
router := router.New()
|
|
|
|
// Static routes
|
|
router.Get("/", func(params []string) {
|
|
fmt.Println("Root handler")
|
|
})
|
|
router.Get("/users/all", func(params []string) {
|
|
fmt.Println("All users")
|
|
})
|
|
|
|
// Parameter routes
|
|
router.Get("/users/[id]", func(params []string) {
|
|
userID := params[0]
|
|
fmt.Printf("User ID: %s\n", userID)
|
|
})
|
|
|
|
// Nested parameters
|
|
router.Get("/users/[id]/posts/[postId]", func(params []string) {
|
|
userID := params[0]
|
|
postID := params[1]
|
|
fmt.Printf("User %s, Post %s\n", userID, postID)
|
|
})
|
|
|
|
// Wildcard routes
|
|
router.Get("/files/*path", func(params []string) {
|
|
filePath := params[0]
|
|
fmt.Printf("File path: %s\n", filePath)
|
|
})
|
|
|
|
// Lookup routes
|
|
if handler, params, ok := router.Lookup("GET", "/users/123"); ok {
|
|
handler(params)
|
|
}
|
|
```
|
|
|
|
## Benchmarks
|
|
|
|
Benchmark results comparing our router to the standard `http.ServeMux` on AMD Ryzen 9 7950X:
|
|
|
|
```
|
|
cpu: AMD Ryzen 9 7950X 16-Core Processor
|
|
|
|
BenchmarkComparison/root_path
|
|
Router: 2.098 ns/op 0 B/op 0 allocs/op
|
|
ServeMux: 32.010 ns/op 0 B/op 0 allocs/op
|
|
|
|
BenchmarkComparison/static_path
|
|
Router: 16.050 ns/op 0 B/op 0 allocs/op
|
|
ServeMux: 67.980 ns/op 0 B/op 0 allocs/op
|
|
|
|
BenchmarkComparison/dynamic_path
|
|
Router: 39.170 ns/op 16 B/op 1 allocs/op
|
|
ServeMux: 174.000 ns/op 48 B/op 3 allocs/op
|
|
|
|
BenchmarkComparison/not_found
|
|
Router: 10.580 ns/op 0 B/op 0 allocs/op
|
|
ServeMux: 178.100 ns/op 56 B/op 3 allocs/op
|
|
```
|
|
|
|
Key Performance Points:
|
|
- Root path lookups are 15x faster
|
|
- Static paths are 4x faster with zero allocations
|
|
- Dynamic paths are 4.4x faster with fewer allocations
|
|
- Not found paths are 16.8x faster with zero allocations
|
|
|
|
## License
|
|
|
|
Licensed under MIT. [Take a look!](LICENSE) |