静态服务器
使用go语言创建一个静态服务只需要几行代码,这里顺便做成一个命令行的客户端吧。使用flag和http标准包,就可以简单的构成了,如下:
flag
导入flag包,
import "flag"
这里简单的讲解一下flag包的使用:
Go语言通过使用标准库里的flag包来处理命令行参数。标准库文档
简单的使用方式:
-
通过flag.String(), Bool(), Int()等方式来定义命令行中需要使用的flag。或者使用例如flag.IntVar()函数,传入变量地址,将获取的值放入变量中。
-
在定义完flag后,通过调用flag.Parse()来进行对命令行参数的解析。
-
命令行参数的格式可以是:
-flag xxx (使用空格,一个 - 符号)
–flag xxx (使用空格,两个 - 符号)
-flag=xxx (使用等号,一个 - 符号)
–flag=xxx (使用等号,两个 - 符号)
这些形式里面,使用布尔类型的参数,为了防止解析时的二义性,应该使用等号的方式指定。
对于该工具,这里接收一个参数,用来指定服务的监听端口。代码如下:
package main
import (
"flag"
)
var (
port int
)
func init() {
flag.IntVar(&port, "p", 8080, "文件服务的端口号") // 不传默认 8080
}
func main() {
flag.Parse()
}
使用http包
使用http包FileServer方法,FileServer返回一个使用FileSystem接口root提供文件访问服务的HTTP处理器。要使用操作系统的FileSystem接口实现,可使用http.Dir:
http.Handle("/", http.FileServer(http.Dir("/tmp")))
启动一个静态文件服务示例:
log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir("/usr/share/doc"))))
两者结合,最后的代码
package main
import (
"flag"
"fmt"
"log"
"net/http"
"os"
)
var (
port int
)
func init() {
flag.IntVar(&port, "p", 8080, "文件服务的端口号")
}
func main() {
flag.Parse()
execPath, err := os.Getwd() // 默认启动的路径为,命令执行的路径
if err != nil {
log.Fatal("Error: ", err)
}
fmt.Println("path: ", execPath)
http.Handle("/", http.FileServer(http.Dir(execPath)))
fmt.Println("file server is running at port : ", port)
err = http.ListenAndServe(fmt.Sprintf(":%d", port), nil)
if err != nil {
log.Fatal("Error: ", err)
}
}