Golang 中 http.FileServer 的几种玩法
自用笔记,仅作参考
最简例子
package main
import (
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir("D:\\Coding\\learnGo\\src\\main\\html\\")))
http.ListenAndServe(":8080", nil)
}
这样,一个最简易的文件服务器就算搭建好了。
其中
http.Handle
的第一个参数用于网页地址,第二个相当于对应磁盘上的文件夹,默认会寻找index.html
文件,但并不会执行其中(如果有引用)的 JS 代码。
注意,若使用
Handle
函数,第一个参数必须与目录下的文件夹名相同。这个问题可以使用HandleFunc
解决。呈现一个 html 文件
package main
import (
"fmt"
"html/template"
"log"
"net/http"
)
func index(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
t, err := template.ParseFiles("D:\\Coding\\learnGo\\src\\main\\html\\index.html")
if err != nil {
fmt.Fprintf(w, "parse template error: %s", err.Error())
return
}
t.Execute(w, nil)
}
}
func main() {
http.HandleFunc("/", index)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("Listen AndServe: ", err)
}
}
在这个例子中,可以自定义页面链接和需要的 html 文件。通常 html 书写方法在多页面开发上效率较低,因此需要使用
http/template
中支持的模板引擎语法来对 html 文件进行重写。只允许访问文件
func js(w http.ResponseWriter, r *http.Request) {
fmt.Printf("禁止访问:%s\n", r.URL.Path)
old := r.URL.Path
name := path.Clean("D:\\Coding\\learnGo\\src\\main\\html\\" + strings.Replace(old, "/js", "/", 1))
info, err := os.Lstat(name)
if err == nil {
if !info.IsDir() {
http.ServeFile(w, r, name)
} else {
http.NotFound(w, r)
}
} else {
http.NotFound(w, r)
}
}
Go 在 Linux 系统中的安装方法
顺手记一下 Go 在 Linux 系统中的配置。
- 下载源文件
$ wget https://dl.google.com/go/go1.11.4.linux-amd64.tar.gz
- 将下载的二进制包解压至 /usr/local目录
$ tar -C /usr/local -xzf go1.4.linux-amd64.tar.gz
- 将 /usr/local/go/bin 目录添加至PATH环境变量,在/etc/profile文件追加
$ echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
- 使修改的配置生效
$ source /etc/profile
参考资料
评论
发表评论