2017-10-21 56 views
0

我去学习网络编程和了解寄托都发生了什么,但我在这3个看似简单的线条迷路:Golang提供静态文件,请解释这3行代码

fs := http.FileServer(http.Dir("public")) 
handler := http.StripPrefix("/static/", fs) 
mux.Handle("/static/", handler) 

.. 。我已经阅读了去SRC以下行,这就是我可以推断:

  1. http.Dir("public")是铸造字符串“公众”,键入目录。
  2. 然后我们为一个文件(包括其所有内容)http.FileServer()
  3. 我们剥去前缀,因为现在我们是handleFunc()内为FS
  4. StripPrefix()创建的HandlerFunc()
  5. mux.Handle()在多路复用器中注册HandlerFunc()。
  6. 深进了兔子洞......然后这个够程go c.serve(ctx)通过func (srv *Server) Serve(l net.Listener) error {}
  7. 所以里面/public/ DIR每个静态文件是由我们的服务器同时提供服务。

有人可以确认或解释3行代码中究竟发生了什么。

回答

0

确认:

您正在注册静态文件的自动处理程序。将通过发送/public目录中的文件同时处理形式为GET /static/some_file的请求。

3

望着我觉得文档后,这是发生了什么:

http.Dir("public") 

要转换的string"public"到根据docs它实现了FileSystem接口

fs := http.FileServer(http.Dir("public")) 

类型Dir做:

FileServer返回一个处理程序,该处理程序以root用户身份提供文件系统的 内容的HTTP请求。

root作为Dir要传递作为参数

handler := http.StripPrefix("/static/", fs) 

您包装在由StripPrefix FUNC创建的HandlerHandlerfs

其中根据docs确实:

StripPref九返回除去 从请求的URL路径给定的前缀和调用处理程序 ^ h

h是用于HTTP请求处理程序Handlerfs你作为参数传递

mux.Handle("/static/", handler) 

你让所有以/static/开头的请求都由handler处理

因此总之所有请求的路径为/static/将删除/static/前缀,并将从您的服务器上的public目录返回具有相同名称的文件,例如。 /static/requestedFile.txt的请求将返回该文件根据public/requestedFile.txt