net/http包中handle().handlefunc()是什么区别?

keke · 2013-03-31 07:26:42 · 12000 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-03-31 07:26:42 的主题,其中的信息可能已经有所发展或是发生改变。

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) 这个是模式匹配,对应处理函数。 func Handle(pattern string, handler Handler) 这个是干嘛用的呢?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

12000 次点击  
加入收藏 微博
4 回复  |  直到 2016-01-13 04:11:16
polaris
polaris · #1 · 13年之前

Handler是一个接口。

而HandleFunc和Handle都是调用DefaultServeMux对应的方法,而DefaultServeMux是ServeMux的实例,ServeMux实现了Handler接口。事实上,HandleFunc最终还是会调用Handle方法。代码如下:

func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    mux.Handle(pattern, HandlerFunc(handler))
}

明白了吧?

大部分时候用HandleFunc()即可,方便(因为接收func函数);而如果想自己实现Handler接口,则可以使用Handle()

keke
keke · #2 · 13年之前

还不是很明白,handle()怎么用,能否给个例子?实现handlefun("/hello",hello)的功能

polaris
polaris · #3 · 13年之前

比如 本站对于静态资源的处理方式:

http.Handle("/static/", http.FileServer(http.Dir(ROOT)))

这里的http.FileServer就返回一个Handler实例,net/http包中类似的还有

func NotFoundHandler() Handler
func RedirectHandler(url string, code int) Handler
func StripPrefix(prefix string, h Handler) Handler
func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler
IcoicoFire
IcoicoFire · #4 · 10年之前

package main import ( "fmt" "net/http" )

type AppHandler struct { appName string }

func(index AppHandler) ServeHTTP(w http.ResponseWriter, r http.Request) { fmt.Fprintf(w, "hello, %s!", index.appName) }

func main() { index := new(AppHandler) index.appName = "sample app" http.Handle("/", index) http.ListenAndServe(":8080", nil) }

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传