Golang实现静态服务器详解
Go的http库已经做了很好的底层封装,所以用该库可以用很简单的几十行代码编写一个http静态服务器。下面我们就具体分析一下http库对静态服务器的具体实现。
package main
import (
"net/http"
)
func StaticServer(w http.ResponseWriter, r *http.Request) {
http.StripPrefix("/", http.FileServer(http.Dir("./static/"))).ServeHTTP(w, r)
}
func main() {
http.HandleFunc("/", StaticServer)
http.ListenAndServe(":8080", nil)
}
以上代码,在本地8080端口上打开一个http服务,可以访问当前目录下的static文件夹下的内容。具体实现都封装在http库里面了,好在go语言的库都是提供源代码的,我们可以一窥其全貌。
http服务实现部分我将会用另外一篇文章做说明,这里只讲http静态文件部分,即 以下这句代码的实现细节:
http.StripPrefix("/", http.FileServer(http.Dir("./static/"))).ServeHTTP(w, r)
首先 http.Dir("./static/") 这个结构体在“\Go\src\net\http\fs.go” 文件中实现,代码如下:
// A Dir implements FileSystem using the native file system restricted to a
// specific directory tree.
//
// While the FileSystem.Open method takes '/'-separated paths, a Dir's string
// value is a filename on the native file system, not a URL, so it is separated
// by filepath.Separator, which isn't necessarily '/'