Gin 或者说 httprouter 的路由使用的数据结构是动态压缩的 trie.
每个 HTTP 方法维护着一个 trie. 不像 Rails 遇到路由冲突的时候, 定义在前的会覆盖后面的, Gin 在 build 的时候就会 panic.
几种冲突的场景:
- 在插入 wildcard 节点时, 父节点的 children 数组非空且 wildChild 被设置为 false. 例如:
GET /user/getAll
和GET /user/:id/getAddr
, 或者GET /user/*aaa
和GET /user/:id
. - 在插入 wildcard 节点时, 父节点的 children 数组非空且 wildChild 被设置为 true , 但该父节点的 wildcard 子节点要插入的 wildcard 名字不一样. 例如:
GET /user/:id/info
和GET /user/:name/info
. - 在插入 catchAll 节点时, 父节点的 children 非空. 例如:
GET /src/abc
和GET /src/*filename
, 或者GET /src/:id
和GET /src/*filename
. - 在插入 static 节点时, 父节点的 wildChild 字段被设置为 true.
- 在插入 static 节点时, 父节点的 children 非空, 且子节点 nType 为 catchAll.
Related: