Trie.go
![Build Status](https://travis-ci.org/importcjj/trie-go.svg?branch=master)
Usage
tree := trie.New()
tree.Put("/", "root")
tree.Put("/<id:int>", "name pattern")
duplicated := tree.Has("/")
ok, result := tree.Match("/")
ok, result = tree.Match("/123")
ok, result = tree.Match("/hi")
ok, node := tree.GetNode("/<id:int>")
if ok {
node.Data["put_data"] = "hello"
}
Examples
A HTTP router base on it.
package main
import (
"fmt"
"net/http"
"os"
"github.com/importcjj/trie-go/router"
)
func Helloworld(ctx *router.Context) {
ctx.WriteString("hello, world!")
}
func ParamHandler(ctx *router.Context) {
username := ctx.ParamString("username")
text := fmt.Sprintf("hi, %s", username)
ctx.WriteString(text)
}
var PageResource = &router.Handler{
OnGet: func(ctx *router.Context) {
filepath := ctx.ParamString("filepath")
text := fmt.Sprintf("Get page %s", filepath)
ctx.WriteString(text)
},
OnPost: func(ctx *router.Context) {
filepath := ctx.ParamString("filepath")
text := fmt.Sprintf("Post page %s", filepath)
ctx.WriteString(text)
},
}
func BasicAuth(ctx *router.Context) {
fmt.Fprintln(os.Stderr, ctx.Request.URL, "Call Basic Auth.")
}
func BeforeMetric(ctx *router.Context) {
ctx.Params["time"] = time.Now().Format("Mon Jan 2 15:04:05 -0700 MST 2006")
}
func AfterMetric(ctx *router.Context) {
start, _ := time.Parse("Mon Jan 2 15:04:05 -0700 MST 2006", ctx.Params["time"])
dur := time.Since(start)
fmt.Fprintf(os.Stderr, "%s spent", dur.String())
}
var r = router.New()
func init() {
r.Get("/hello/world", Helloworld)
r.Get("/hi/<username:str>", ParamHandler)
r.Router("/page/<filepath:*>", PageResource)
r.Before("/", BasicAuth, BeforeMetric)
r.After("/", AfterMetric)
}
func main() {
server := &http.Server{
Addr: ":8080",
Handler: r,
}
server.ListenAndServe()
}