缓存或保留值,即使进程结束



在 GoLang 中编写 CLI 应用程序,并希望在不同的会话/命令中使用 URL。通过 Cobra 实现 CLI,我想在开始时配置 URL,然后继续在其他命令中使用它。

尝试使用以下方法 -

os.Setenv("URL", URL) os.Getenv("URL")

上述方法仅适用于同一进程(如果设置和获取进程不同,则不起作用(。

知道我们该怎么做吗?

更新: 我想知道是否可以在 Go 中完成? 我知道可以通过将其存储在 file/db 中甚至设置在环境变量中但探索在 Go 中做到这一点的方法来轻松完成。

我也面临类似的情况, 这就是我解决问题的方式, 就我而言,我需要保留一个端点,并且该端点在所有其他命令中进一步使用,

我将值存储在 sqlite db 中,并在所有其他命令中使用。

db, err := sql.Open("sqlite3", "./value.db")
if err != nil {
fmt.Println("Unable to open Sqlite connection:", err)
}
defer db.Close()
sqlStmt := `
CREATE TABLE IF NOT EXISTS endpoint (name TEXT);
DELETE FROM endpoint;
`
_, err = db.Exec(sqlStmt)
if err != nil {
fmt.Println(err)
return
}
tx, err := db.Begin()
if err != nil {
fmt.Println(err)
return
}
stmt, err := tx.Prepare("INSERT INTO endpoint(name) VALUES(?)")
if err != nil {
fmt.Println(err)
return
}
defer stmt.Close()
_, err = stmt.Exec(endPoint)
if err != nil {
fmt.Println(err)
return
}
err = tx.Commit()
if err != nil {
fmt.Println(err)
return
}
rows, err := db.Query("SELECT name FROM endpoint")
if err != nil {
fmt.Println(err)
return
}
defer rows.Close()
for rows.Next() {
var endpoint string
err = rows.Scan(&endpoint)
if err != nil {
fmt.Println(err)
return
}
}
err = rows.Err()
if err != nil {
fmt.Println(err)
return
}

您可以建立一个简单的侦听器,为其他进程的请求提供服务。它可以接收和提供任何类型的内容。

使用net 使用 go 设置侦听守护进程非常容易。听("tcp",":8080">(。也许您可以将这些片段作为样板:

package main
import (
"fmt"
"io"
"log"
"net"
"strings"
)
type textProcessor struct {
input *string
}
func (this textProcessor) Write(b []byte) (int, error) {
*this.input = string(b)
return len(strings.TrimSpace(string(b))), nil
}
func main() {
t := textProcessor{new(string)}
l, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatal(err)
}
defer l.Close()
for {
// Wait for connection
conn, err := l.Accept()
if err != nil {
log.Fatal(err)
}
io.Copy(t, conn)
fmt.Print("Echo: ", *t.input)
conn.Close()
}
}

使用telnet localhost 8080检查一下,然后输入一些垃圾。

最新更新