我有一个程序,它需要1或2个参数,这取决于用户想要运行什么。
var (
clientSet = tools.NewClientSet(os.Args[2])
)
func main {
if os.Args[1] == "validate" {
// run validate function, no need for user to have os.Args[2]
}else if os.Args[1] == "sync" {
// run sync function that requires os.Args[2]
}
}
func foo{
tools.Manage(clientSet)
}我需要clientSet变量是全局的,但如果用户只想使用验证函数,则不需要用户拥有os.Args2。将clientSet函数放入main()将使我的foo()函数中断,并且我不能声明一个带有空值的变量。
因此,我希望我的用户能够顺利地运行go run main.go validate和go run main.go sync production。
*生产是一个任意的值
我可以让我的用户运行go run main.go validate _来解决这个问题,但这是不可能的。解决这个问题的最好方法是什么?
发布于 2018-11-08 05:59:13
在这种情况下,我甚至不认为需要一个全局变量。您只需让同步函数接受一个ClientSet,例如func sync(c ClientSet)。但是,如果您确实需要全局变量,那么您不应该这样做,除非您希望您的程序在没有参数的情况下恐慌。
var (
clientSet = tools.NewClientSet(os.Args[2])
)您应该做的是为它分配一个默认值或您类型的零值。
var (
clientSet tools.ClientSet
)您的主要功能看起来有点像这样:
var (
clientSet tools.ClientSet
)
func main() {
if len(os.Args) < 2 {
os.Exit(1)
}
switch os.Args[1] {
case "validate":
validate()
case "sync":
if len(os.Args) < 3 {
os.Exit(1)
}
clientSet = tools.NewClientSet(os.Args[2])
sync()
default:
// place your default case here
}
}不过,我建议您将一个ClientSet传递给同步函数,因为它将避免全局变量。
发布于 2018-11-08 05:50:57
答案往往是不要使用全局词。相反,让foo接受一个参数foo(clientSet ClientSet),并且只在需要的时候实例化它。
发布于 2018-11-08 06:36:08
只需使用len(os.Args)函数即可
var (
clientSet tools.ClientSet
)
func main() {
if len(os.Agrs) == 1 {
// just the file name
} else if len(os.Args) == 2 {
if os.Args[1] == "validate" {
// run validate function, no need for user to have os.Args[2]
} else if os.Args[1] == "sync" {
// sync with no argument show error
}
} else if len(os.Args) == 3 {
if os.Args[1] == "validate" {
clientSet = tools.NewClientSet(os.Args[2])
} else {
// non validate with the second arg
}
} else {
// else, if required
}
}尽管我建议你不要使用全局变量。如果可能的话,尽量避免。
https://stackoverflow.com/questions/53201763
复制相似问题