A server chooses handler logic by matching the request path.

route A route maps a request path to the code that should build the response.

Route Matching

path
route_matching.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

type request struct {
	Path string
}

func handlerName(path string) string {
	if path == "/health" {
		return "healthHandler"
	}
	if path == "/users" {
		return "usersHandler"
	}
	return "notFoundHandler"
}

func main() {
	var path = "/health"
	req := request{Path: path}
	handler := handlerName(req.Path)

	fmt.Println("path=", req.Path)
	fmt.Println("handler=", handler)
	fmt.Println("matched=", handler != "notFoundHandler")
}
package main

import "fmt"

type request struct {
	Path string
}

func handlerName(path string) string {
	if path == "/health" {
		return "healthHandler"
	}
	if path == "/users" {
		return "usersHandler"
	}
	return "notFoundHandler"
}

func main() {
	var path = "/users"
	req := request{Path: path}
	handler := handlerName(req.Path)

	fmt.Println("path=", req.Path)
	fmt.Println("handler=", handler)
	fmt.Println("matched=", handler != "notFoundHandler")
}
package main

import "fmt"

type request struct {
	Path string
}

func handlerName(path string) string {
	if path == "/health" {
		return "healthHandler"
	}
	if path == "/users" {
		return "usersHandler"
	}
	return "notFoundHandler"
}

func main() {
	var path = "/missing"
	req := request{Path: path}
	handler := handlerName(req.Path)

	fmt.Println("path=", req.Path)
	fmt.Println("handler=", handler)
	fmt.Println("matched=", handler != "notFoundHandler")
}
  1. req ← main.request{Path:"/health"}

    19func main() {20  var path = "/health" //@path="/users", "/missing"21  req→ main.request{Path:"/health"} := request{Path: path}22  handler := handlerName(req.Path"/health")
  2. handler ← "healthHandler"

    21  req := request{Path: path}22  handler→ "healthHandler" := handlerName(req.Path"/health")2324  fmt.Println("path=", req.Path"/health")25  fmt.Println("handler=", handler"healthHandler")26  fmt.Println("matched=", handler"healthHandler" != "notFoundHandler")27}
    outputpath= /health
    handler= healthHandler
    matched= true
  1. req ← main.request{Path:"/users"}

    19func main() {20  var path = "/users"21  req→ main.request{Path:"/users"} := request{Path: path}22  handler := handlerName(req.Path"/users")
  2. handler ← "usersHandler"

    21  req := request{Path: path}22  handler→ "usersHandler" := handlerName(req.Path"/users")2324  fmt.Println("path=", req.Path"/users")25  fmt.Println("handler=", handler"usersHandler")26  fmt.Println("matched=", handler"usersHandler" != "notFoundHandler")27}
    outputpath= /users
    handler= usersHandler
    matched= true
  1. req ← main.request{Path:"/missing"}

    19func main() {20  var path = "/missing"21  req→ main.request{Path:"/missing"} := request{Path: path}22  handler := handlerName(req.Path"/missing")
  2. handler ← "notFoundHandler"

    21  req := request{Path: path}22  handler→ "notFoundHandler" := handlerName(req.Path"/missing")2324  fmt.Println("path=", req.Path"/missing")25  fmt.Println("handler=", handler"notFoundHandler")26  fmt.Println("matched=", handler"notFoundHandler" != "notFoundHandler")27}
    outputpath= /missing
    handler= notFoundHandler
    matched= false