为了账号安全,请及时绑定邮箱和手机立即绑定

在go中声明一个没有值的全局变量

在go中声明一个没有值的全局变量

Go
Helenr 2023-05-08 15:05:52
我有一个程序需要 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.Args[2]。将函数放在clientSet里面main()会使我的foo()函数损坏,并且我无法声明一个具有空值的变量。所以我希望我的用户能够顺利go run main.go validate运行go run main.go sync production。*生产是一个任意值我可以让我的用户运行来go run main.go validate _解决这个问题,但那会很不雅观。解决这个问题的最佳方法是什么?
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

在这种情况下,我什至不认为需要全局变量。您可以让同步功能接受一个ClientSeteg 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

    }


}

尽管如此,我还是建议您将 a 传递ClientSet给 sync 函数,因为它会避免使用全局变量。


查看完整回答
反对 回复 2023-05-08
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

答案通常是不使用全局变量。取而代之的是foo接受一个参数foo(clientSet ClientSet)并仅在需要时实例化它。



查看完整回答
反对 回复 2023-05-08
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

只需使用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

    }

}

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


查看完整回答
反对 回复 2023-05-08
  • 3 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信