忍不住对net.http吐下槽

319 views
Skip to first unread message

Changming Sun

unread,
May 13, 2012, 6:52:26 AM5/13/12
to golang...@googlegroups.com

ServeMux这个类中有一个map,存储从url patternHandler的映射。

这些代码不知道是谁写的,感觉就像玩具一样。

这里的pathMatch,既不是精确匹配,也不是正则匹配,而是按前缀匹配。

match函数在对ServeMux里这个map做查找的时候,是全遍历,然后取长度最长的。通常来说,我们写的pattern都是精确的url,但是这里的匹配方式,使得即使找到了我想要的那个handler,还是得继续continue到最后一个record

另外,我无法往这里面注册”/”

因为我一旦注册了”/”,所有的url都会被匹配,那么无论来什么请求,都不会返回404

Ruiqi Hong

unread,
May 13, 2012, 8:06:35 AM5/13/12
to golang...@googlegroups.com
通常来说,我们写的pattern都是精确的url
这点有疑问,没有正则的情况下,很多url pattern确实只是前缀,最长匹配可以适应更多情况。而且不用考虑pattern注册的顺序,意味着pattern可以在不同的地方注册而不用集中管理。如果用正则就是另外一回事了。
404的问题:Python中通常也会有一个/.*,也会造成这个问题吧...在handler逻辑里处理下就好了
个人觉得只是使用习惯问题...

shiwei xu

unread,
May 13, 2012, 9:48:11 PM5/13/12
to golang...@googlegroups.com
我觉得不玩具。原因:

1. go 的 http 不希望引入 regex 来做路由表。
2. go 的路由要想优化比 regex 方式空间大,比如用编译原理中处理正则匹配的状态机来compile下路由表,完全可以做到只遍历一遍url就完成,这会比其他框架的路由表高效很多。 只是没急着在这里去优化,因为遍历看起来慢,但通常一个 server 的路由比较少,其实最多也就几十个而已。

在 2012年5月13日 下午6:52,Changming Sun <m...@sunchangming.com>写道:



--
许式伟

Changming Sun

unread,
May 13, 2012, 10:57:43 PM5/13/12
to golang...@googlegroups.com

Ø  go 的路由要想优化比 regex 方式空间大

从理论上来说,需求越简单,实现就可以越高效。当它实际想去做那些优化的时候,代码就没现在这么优雅了。

 

而且,go 1已经发布了,接口不适合再做大的变动。按现在的接口规范来说,没法注册”/”

 

Ruiqi Hong

unread,
May 14, 2012, 2:40:18 AM5/14/12
to golang...@googlegroups.com
注册 /,然后在 / 的handler里,判断路径。如果不是 / ,返回 404 不行么?

--
官网: http://golang-china.org/
IRC: irc.freenode.net #golang-china
@golangchina

Liigo Zhuang

unread,
May 14, 2012, 9:00:41 PM5/14/12
to golang...@googlegroups.com
我也不觉得是玩具,没有这么丑陋的玩具。我想做成精确匹配和模糊匹配相结合比较好,是否模糊匹配应该取决于用户的pattern,如 /* 应模糊匹配, / 应精确匹配,这样程序员有明确的预期。从现在的结果看,它的设计思路和出发点有问题,给用户/程序员造成了不必要的困扰,额外引入了复杂度。但是这里的fans们是不会正视问题的。

--
by Liigo, http://blog.csdn.net/liigo/

Xing Xing

unread,
May 14, 2012, 9:23:22 PM5/14/12
to golang...@googlegroups.com
于 Tue, 15 May 2012 09:00:41 +0800
Liigo Zhuang <com....@gmail.com> 写道:

> 我也不觉得是玩具,没有这么丑陋的玩具。我想做成精确匹配和模糊匹配相结合比较好,是否模糊匹配应该取决于用户的pattern,如 /*
> 应模糊匹配, /
> 应精确匹配,这样程序员有明确的预期。从现在的结果看,它的设计思路和出发点有问题,给用户/
> 程序员造成了不必要的困扰,额外引入了复杂度。但是这里的fans们是不会正视问题的。
>

引用 rsc 的话说“Sorry, but no.”。

golang 的思想更接近 c,而不是 java 或者 dotnet。

实际上在现有相对成熟的 web 框架中,router
往往都是作为一个独立的模块存在的。那么我认为 golang 也不会例外,现有的
net/http 包已经提供了足够的完整的 http 所需的功能。至于 session、router
这其实与 http 本身并无关系,只是需要 session、router 与 http
配合实现更加高效的开发。

一句话,不要期望基础库承载所有开发需求。

如果你有更好的设计,完全可以开发一个 router 的 package:

r := router.New()
// r := router.NewFromServerMux(sm *http.ServerMux)
r.Regex("/[a-z]+/[0-9]+", fooHandler)
r.Wildcard("/*", fooHandler)
r.NotFound(notFoundHandler)
r.InternalError(internalErrorHandler)

另外,Liigo,讨论就是讨论,咱们不提什么 fans 不
fans,正视不正视的这些容易引起毫无意义的口水仗的内容好不?


Changming Sun

unread,
May 14, 2012, 10:45:45 PM5/14/12
to golang...@googlegroups.com

我一旦注册了”/”,所有的url都会被匹配,那么无论来什么请求,都不会返回404

qq wu

unread,
May 14, 2012, 11:19:42 PM5/14/12
to golang...@googlegroups.com
既然你注册了 / ,在相应的 handler 中检查一下 url ,对于错误情况返回 404 就可以了。这个很简单啊。
我也同意 Xing Xing 的看法,url 的 dispatch 已经和 http 协议本身没有多大关系了,应该再另起一个包。模块的分工应该更明确。

Ruiqi Hong

unread,
May 14, 2012, 11:52:19 PM5/14/12
to golang...@googlegroups.com
我只是提供一个在当前环境下的解决方案,并不是说可以这样就很好。
一开始用 HTTP 包的时候,我也觉得路径选择为什么没有用Python很多框架那样的正则,而是用了这样奇怪的方式。可以用多了以后,发现功能也没有想象中的那么弱,只是很多需求需要自己去实现(很多其它的Package也是这样的)。如果路径选择中出现路径匹配不了的状况,那是不是还要专门提供一个接口定义错误页面?
至于前缀匹配即可匹配整个URL和“/”的问题,我觉得是文档没有说清楚(文档没有说清楚的地方也有很多)。要是文档明确也就没有什么困扰了。

qihang zhang

unread,
Jul 9, 2012, 3:47:25 AM7/9/12
to golang...@googlegroups.com
可以看一下这个


项目。

挺全的工具包

其中
mux Package gorilla/mux implements a request router and dispatcher.
pat Package gorilla/pat is a request router and dispatcher with a pat-like interface.

这两个是用来dispatcher的


--

高帆

unread,
Sep 3, 2012, 3:37:24 AM9/3/12
to golang...@googlegroups.com
我也同意基础部分不要用正则,正则相对于专门为URL写的状态机机制还是慢很多的。
--
welcom to http//www.fanflash.cn
Reply all
Reply to author
Forward
0 new messages