全局变量不会从CLI命令持久化

时间:2018-01-18 11:30:11

标签: go command-line-interface

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值,但是当我写一个,另一个不能读它等。

感谢。

1 个答案:

答案 0 :(得分:3)

tests是一个全局变量。只要您的流程正在运行,它就会保持其价值。

但是,当您运行./test arg时,会启动一个新流程,向tests添加一个元素,然后退出。 ./test arg的下一次调用是一个全新的过程,它无法与之前的调用共享信息。

使用./test arg运行的进程与以./test启动的当前运行的Web服务器完全不同。同样的事情:他们没有共享任何状态,他们恰好是相同的二进制文件。

如果要在给定程序的调用之间保留某些内容,则需要将数据保存在某处(文件,数据库等)。