几行代码创建一个静态服务.md

静态服务器

使用go语言创建一个静态服务只需要几行代码,这里顺便做成一个命令行的客户端吧。使用flaghttp标准包,就可以简单的构成了,如下:

flag

导入flag包,

1
import "flag"

这里简单的讲解一下flag包的使用:
Go语言通过使用标准库里的flag包来处理命令行参数。标准库文档

简单的使用方式:

  1. 通过flag.String(), Bool(), Int()等方式来定义命令行中需要使用的flag。或者使用例如flag.IntVar()函数,传入变量地址,将获取的值放入变量中。

  2. 在定义完flag后,通过调用flag.Parse()来进行对命令行参数的解析。

  3. 命令行参数的格式可以是:

    -flag xxx (使用空格,一个 - 符号)

    –flag xxx (使用空格,两个 - 符号)

    -flag=xxx (使用等号,一个 - 符号)

    –flag=xxx (使用等号,两个 - 符号)

这些形式里面,使用布尔类型的参数,为了防止解析时的二义性,应该使用等号的方式指定。

对于该工具,这里接收一个参数,用来指定服务的监听端口。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import (
"flag"
)

var (
port int
)

func init() {
flag.IntVar(&port, "p", 8080, "文件服务的端口号") // 不传默认 8080
}

func main() {
flag.Parse()
}

使用http包

使用httpFileServer方法,FileServer返回一个使用FileSystem接口root提供文件访问服务的HTTP处理器。要使用操作系统的FileSystem接口实现,可使用http.Dir:

1
http.Handle("/", http.FileServer(http.Dir("/tmp")))

启动一个静态文件服务示例:

1
log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir("/usr/share/doc"))))

两者结合,最后的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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)
}
}