package main
import (
"fmt"
"net/http"
"os"
"strconv"
"github.com/go-chi/chi"
)
var tests []string
func main() {
if len(os.Args[:]) > 1 {
tests = append(tests, "test")
fmt.Println(strconv.Itoa(len(tests)) + " tests")
os.Exit(0)
}
r := chi.NewRouter()
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
tests = append(tests, "test")
fmt.Println(strconv.Itoa(len(tests)) + " tests")
})
http.ListenAndServe(":8086", r)
}
当我从 localhost:8086 访问该程序时,它工作正常,我可以在刷新时看到 len(tests)
递增。
但是当我使用 ./test arg
命令访问程序时,len(tests)
递增到 1 但随后丢失,所以下次它说 1 并且永远不会更高。
我认为这两个方法也应该共享相同的 tests
值,但是当我写入其中一个时,另一个无法读取等等。
谢谢。
最佳答案
tests
是一个全局变量。只要您的流程在运行,它就会保持其值(value)。
但是,当您运行 ./test arg
时,这将启动一个新进程,将一个元素添加到 tests
,然后退出。 ./test arg
的下一次调用是一个全新的过程,它无法与上一次调用共享信息。
以./test arg
运行的进程也完全不同于以./test
启动的当前运行的网络服务器。同一件事:它们不共享任何状态,它们恰好是相同的二进制文件。
如果您想在给定程序的调用之间保留某些内容,您需要将数据保存在某个地方(文件、数据库等...)。
关于go - 全局变量不会从 CLI 命令中保留下来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48320279/