我有一个程序需要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
变量是全局变量,但是如果用户只想使用validate函数,则不需要用户具有os.Args [2]。将clientSet
函数放在main()
内将使我的foo()
函数损坏,并且我无法声明具有空值的变量。
因此,我希望我的用户能够平稳运行go run main.go validate
和go run main.go sync production
。
*产量是一个任意值
我可以让我的用户运行go run main.go validate _
来解决此问题,但是这太小巧了。解决此问题的最佳方法是什么?
答案 0 :(得分:1)
答案通常是不使用全局变量。而是让foo
接受参数foo(clientSet ClientSet)
并仅在需要时实例化它。
答案 1 :(得分:1)
在这种情况下,我什至看不到需要全局变量。您只需使同步功能接受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
传递给sync函数,因为它将避免使用全局变量。
答案 2 :(得分:0)
只需使用 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
}
}
尽管如此,我建议您不要使用全局变量。尽可能避免。