英文:
How to create map in Golang with global variable as value?
问题
我有一个方法来检查是否存在所需的环境变量,如果存在,则设置它,否则填充错误消息。我正在按照以下方式进行操作:
package main
import (
"errors"
"fmt"
"os"
"strings"
)
var (
AxGitDownloadUrl string
)
const ENV_ERR_MSG_START = "set the following environment variables ->"
const AX_GIT_DOWNLOAD_URL = "AX_GIT_DOWNLOAD_URL"
func main() {
if err := verifyMandatoryEnvVarsAndSet(); err != nil {
fmt.Printf(err.Error())
}
}
func verifyMandatoryEnvVarsAndSet() error {
errMsg := ENV_ERR_MSG_START
m := map[string]string{AX_GIT_DOWNLOAD_URL: AxGitDownloadUrl}
for k, v := range m {
errMsg = setConfig(k, v, errMsg)
}
if len(errMsg) > len(ENV_ERR_MSG_START) {
errMsg = strings.TrimSuffix(errMsg, ",")
return errors.New(errMsg)
}
return nil
}
func setConfig(envVarName, globalEnvVar, errMsg string) string {
fmt.Printf("envVarName -> %s, globalEnvVar -> %s ", envVarName, globalEnvVar)
res, ok := os.LookupEnv(envVarName)
if ok {
globalEnvVar = res
} else {
errMsg = errMsg + envVarName + ","
}
return errMsg
}
我遇到的问题是,在映射的值部分,它没有设置全局变量,而是显示为空。
那么,如何使用setConfig
方法设置全局变量的值呢?
Go Playground链接:https://go.dev/play/p/DC5oPmsjEIQ
英文:
I have a method to check if a required environment variable exists or not, if yes then set it, else populate an error message. I am doing like the following:
package main
import (
"errors"
"fmt"
"os"
"strings"
)
var (
AxGitDownloadUrl string
)
const ENV_ERR_MSG_START = "set the following environment variables ->"
const AX_GIT_DOWNLOAD_URL = "AX_GIT_DOWNLOAD_URL"
func main() {
if err := verifyMandatoryEnvVarsAndSet(); err != nil {
fmt.Printf(err.Error())
}
}
func verifyMandatoryEnvVarsAndSet() error {
errMsg := ENV_ERR_MSG_START
m := map[string]string{AX_GIT_DOWNLOAD_URL: AxGitDownloadUrl}
for k, v := range m {
errMsg = setConfig(k, v, errMsg)
}
if len(errMsg) > len(ENV_ERR_MSG_START) {
errMsg = strings.TrimSuffix(errMsg, ",")
return errors.New(errMsg)
}
return nil
}
func setConfig(envVarName, globalEnvVar, errMsg string) string {
fmt.Printf("envVarName -> %s,globalEnvVar->%s ", envVarName, globalEnvVar)
res, ok := os.LookupEnv(envVarName)
if ok {
globalEnvVar = res
} else {
errMsg = errMsg + envVarName + ","
}
return errMsg
}
The problem I am facing is, in the value part of the map, it is not setting up the global variable, rather I am seeing a blank there.
So how can I set up the global variable value using the setConfig
method?
Go playground link: https://go.dev/play/p/DC5oPmsjEIQ
答案1
得分: 1
你在尝试的操作中,如果不使用指针是无法实现的。变量globalEnvVar
与全局变量没有连接。它是一个位于内存中不同地址的不同对象,它们的内容可能相同,但更新一个对象不会更新另一个对象。
将map改为map[string]*string
,并使用指向你想要更新的变量的指针。在进行更新时,使用指针间接引用,例如*globalEnvVar = res
。
英文:
You can't do what you're trying to do without using pointers. The variable globalEnvVar
has no connection to the global var. It's a different object located at a different address in the memory, their contents may be the same but updating one object will not update the other.
Change the map to map[string]*string
and use pointers-to-variables that you want to update. And when doing the updating use pointer indirection, e.g. *globalEnvVar = res
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论