Go 简单的静态服务器,为每个请求轮流返回静态文件

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文

我用golang编写了一个简单的服务器:

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)
    }
}