Gin 或者说 httprouter 的路由使用的数据结构是动态压缩的 trie.

每个 HTTP 方法维护着一个 trie. 不像 Rails 遇到路由冲突的时候, 定义在前的会覆盖后面的, Gin 在 build 的时候就会 panic.

几种冲突的场景:

  • 在插入 wildcard 节点时, 父节点的 children 数组非空且 wildChild 被设置为 false. 例如: GET /user/getAllGET /user/:id/getAddr, 或者 GET /user/*aaaGET /user/:id.
  • 在插入 wildcard 节点时, 父节点的 children 数组非空且 wildChild 被设置为 true , 但该父节点的 wildcard 子节点要插入的 wildcard 名字不一样. 例如: GET /user/:id/infoGET /user/:name/info.
  • 在插入 catchAll 节点时, 父节点的 children 非空. 例如: GET /src/abcGET /src/*filename, 或者 GET /src/:idGET /src/*filename.
  • 在插入 static 节点时, 父节点的 wildChild 字段被设置为 true.
  • 在插入 static 节点时, 父节点的 children 非空, 且子节点 nTypecatchAll.

Related: