英文:
How to correctly use os.Args in golang?
问题
你可以使用os.Args
来获取命令行参数。os.Args
是一个字符串切片,其中第一个元素是程序的名称,后面的元素是传递给程序的参数。
在你的代码中,你可以这样使用os.Args
:
if len(os.Args) > 1 {
configpath := os.Args[1]
fmt.Println("1") // For debug
} else {
configpath := "/etc/buildozer/config"
fmt.Println("2")
}
configuration := config.ConfigParser(configpath)
然而,你在代码中定义configpath
的方式是不正确的。在if
和else
语句块中,你应该使用赋值操作符=
而不是声明操作符:=
。这样才能在整个函数中访问到configpath
变量。
修正后的代码如下:
var configpath string
if len(os.Args) > 1 {
configpath = os.Args[1]
fmt.Println("1") // For debug
} else {
configpath = "/etc/buildozer/config"
fmt.Println("2")
}
configuration := config.ConfigParser(configpath)
这样,你就可以正确地使用os.Args
获取命令行参数,并将其作为配置文件的路径传递给config.ConfigParser
函数。
英文:
I need to use config in my go code and I want to load config path from command-line.
I try:
if len(os.Args) > 1 {
configpath := os.Args[1]
fmt.Println("1") // For debug
} else {
configpath := "/etc/buildozer/config"
fmt.Println("2")
}
Then I use config:
configuration := config.ConfigParser(configpath)
When I launch my go file with parameter (or without) I receive similar error
# command-line-arguments
src/2rl/buildozer/buildozer.go:21: undefined: configpath
How should I correctly use os.Args?
答案1
得分: 21
在你的if
语句之外定义configPath
。
configPath := ""
if len(os.Args) > 1 {
configPath = os.Args[1]
fmt.Println("1") // 用于调试目的
} else {
configPath = "/etc/buildozer/config"
fmt.Println("2")
}
注意,在if
语句内部使用configPath =
(而不是:=
)。
这样,configPath
在if
语句之前就被定义了,并且在if
语句之后仍然可见。
英文:
Define configPath
outside the scope of your if
.
configPath := ""
if len(os.Args) > 1 {
configPath = os.Args[1]
fmt.Println("1") // For debugging purposes
} else {
configPath = "/etc/buildozer/config"
fmt.Println("2")
}
Note the 'configPath =
' (instead of :=
) inside the if
.
That way configPath
is defined before and is still visible after the if
.
See more at "Declarations and scope" / "Variable declarations".
答案2
得分: 2
另一种方法是将逻辑封装在一个函数中:
package main
import "os"
func configPath(a []string) string {
switch len(a) {
case 1: return "/etc/buildozer/config"
default: return os.Args[1]
}
}
func main() {
config := configPath(os.Args)
println(config)
}
这样可以避免作用域问题。
英文:
For another approach, you can wrap the logic in a function:
package main
import "os"
func configPath(a []string) string {
switch len(a) {
case 1: return "/etc/buildozer/config"
default: return os.Args[1]
}
}
func main() {
config := configPath(os.Args)
println(config)
}
this avoids the scoping issue.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论