go - 全局变量不会从 CLI 命令中保留下来

标签 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 值,但是当我写入其中一个时,另一个无法读取等等。

谢谢。

最佳答案

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

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

./test arg 运行的进程也完全不同于以./test 启动的当前运行的网络服务器。同一件事:它们不共享任何状态,它们恰好是相同的二进制文件。

如果您想在给定程序的调用之间保留某些内容,您需要将数据保存在某个地方(文件、数据库等...)。

关于go - 全局变量不会从 CLI 命令中保留下来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48320279/

相关文章:

ubuntu - Shell命令如何执行以及它们在什么上下文中运行?

go - 使用 go 创建新的 ldap 条目

bash - bash/cli 中的视觉选择

linux - 将 stderr 和 stdout 重定向到同一文件的顺序

linux - 运行 aws cli 时出现 Pyexpat 导入错误

c++ - 在 MFC C++ EXE 中嵌入 DLL?

Golang : Use string. 加入字符串的类型别名

go - 如何使用BurntSushi/toml库将golang结构编码为TOML并写入文件?

google-cloud-datastore - 更新数据存储实体 - 在不更改实体键的情况下更改祖先

Python cmd 模块命令别名