Go 简单的静态服务器,为每个请求轮流返回静态文件
我用golang编写了一个简单的服务器:Go 简单的静态服务器,为每个请求轮流返回静态文件,go,Go,我用golang编写了一个简单的服务器: package main import ( "net/http" ) func main() { http.Handle("/", http.FileServer(http.Dir("./static"))) http.ListenAndServe(":3000", nil) } 我想添加新功能: 每个请求GET/rotate都会从/static文件夹中循环返回一个文件内容。 例如,在/static文
package main
import (
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir("./static")))
http.ListenAndServe(":3000", nil)
}
我想添加新功能:
每个请求GET/rotate都会从/static文件夹中循环返回一个文件内容。
例如,在/static文件夹exist 7文件中,对于每个请求服务器返回:file1、file2、file3
如何在go中做到这一点?下面是一个简单的服务器,它可以帮助您开始实现目标。关于实施,需要注意以下几点: 在程序启动期间,仅加载一次文件名。如果一个文件在程序运行时消失,服务器将在轮换时返回404。 在这种情况下,我们需要通过sync.Mutex使用锁定,因为每个请求将在其自己的go例程中运行。
你能发布你试图实现这一点的代码吗?@Adrian,没有提示代码,我不知道从哪里开始做这件事:那么这个问题太宽泛了。这不是一个代码编写服务。做一些研究,尝试一个实现,如果你有困难,发布一个新的问题。
package main
import (
"flag"
"net/http"
"os"
"path/filepath"
"sync"
)
func main() {
dir := flag.String("dir", ".", "directory of files to serve")
flag.Parse()
f, err := os.Open(*dir)
if err != nil {
panic(err)
}
files, err := f.Readdir(0)
if err != nil {
panic(err)
}
filenames := make([]string, 0, len(files))
for _, file := range files {
if !file.IsDir() {
filenames = append(filenames, file.Name())
}
}
var (
idxLock sync.Mutex
idx int
)
http.HandleFunc("/rotate", func(w http.ResponseWriter, r *http.Request) {
if len(filenames) == 0 {
http.NotFound(w, r)
return
}
idxLock.Lock()
i := idx
idx++
if idx >= len(filenames) {
idx = 0
}
idxLock.Unlock()
http.ServeFile(w, r, filepath.Join(*dir, filenames[i]))
})
if err := http.ListenAndServe(":3000", nil); err != nil {
panic(err)
}
}