声明没有值的全局变量

时间:2018-11-08 04:56:07

标签: variables go global

我有一个程序需要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 validatego run main.go sync production

*产量是一个任意值

我可以让我的用户运行go run main.go validate _来解决此问题,但是这太小巧了。解决此问题的最佳方法是什么?

3 个答案:

答案 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
    }
}

尽管如此,我建议您不要使用全局变量。尽可能避免。