Go 全局变量未从CLI命令中持久化

Go 全局变量未从CLI命令中持久化,go,command-line-interface,Go,Command Line Interface,当我从localhost:8086访问程序时,它工作正常,刷新时可以看到lentests的增量 但是当我使用./test arg命令访问程序时,lentests会增加到1,但随后会丢失,所以下次它会显示1,并且不会再增加 我认为这两个方法也应该共享相同的测试值,但当我向其中一个写入时,另一个无法读取它,等等 谢谢。测试是一个全局变量。只要您的进程正在运行,它就会保持其价值 但是,当您运行./test arg时,将启动一个新进程,向测试添加一个元素,然后退出。下一次调用./test arg是一个全

当我从localhost:8086访问程序时,它工作正常,刷新时可以看到lentests的增量

但是当我使用./test arg命令访问程序时,lentests会增加到1,但随后会丢失,所以下次它会显示1,并且不会再增加

我认为这两个方法也应该共享相同的测试值,但当我向其中一个写入时,另一个无法读取它,等等

谢谢。

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

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

使用./test arg运行的进程与当前使用./test启动的web服务器也完全不同。同样的事情:它们没有共享状态,只是碰巧是同一个二进制


如果您想在调用给定程序之间保留某些内容,则需要将数据保存到文件、数据库等的某个位置。

您是说您不明白为什么您的程序在重新运行程序之间不保留全局数据?@mkopriva是的,我想程序一直在运行,我用来访问它的任何方法都会看到相同的全局变量。使用arg或no arg执行程序总是会启动一个新进程,其中包含一个空的测试片,并且不知道可能已经在运行的其他./test程序。如果给出arg,它将退出;如果没有给出arg,它将在8086上侦听。如果希望cli与服务器通信,则需要两个程序和一个关于如何共享数据的策略。使用globals的一个程序并不能使其正常工作。谢谢,非常有用。在我的实际项目中,它是一个websocket连接数组,所以我不确定是否可以将这些连接存储到文件中,我想我必须通过http而不是cli触发。
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)
}