首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在go中声明一个没有值的全局变量

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

Stack Overflow用户
提问于 2018-11-08 04:56:07
回答 3查看 1.5K关注 0票数 0

我有一个程序,它需要1或2个参数,这取决于用户想要运行什么。

代码语言:javascript
复制
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 validatego run main.go sync production

*生产是一个任意的值

我可以让我的用户运行go run main.go validate _来解决这个问题,但这是不可能的。解决这个问题的最好方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-08 05:59:13

在这种情况下,我甚至不认为需要一个全局变量。您只需让同步函数接受一个ClientSet,例如func sync(c ClientSet)。但是,如果您确实需要全局变量,那么您不应该这样做,除非您希望您的程序在没有参数的情况下恐慌。

代码语言:javascript
复制
var (
   clientSet = tools.NewClientSet(os.Args[2])
)

您应该做的是为它分配一个默认值或您类型的零值。

代码语言:javascript
复制
var (
   clientSet tools.ClientSet
)

您的主要功能看起来有点像这样:

代码语言:javascript
复制
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传递给同步函数,因为它将避免全局变量。

票数 2
EN

Stack Overflow用户

发布于 2018-11-08 05:50:57

答案往往是不要使用全局词。相反,让foo接受一个参数foo(clientSet ClientSet),并且只在需要的时候实例化它。

票数 1
EN

Stack Overflow用户

发布于 2018-11-08 06:36:08

只需使用len(os.Args)函数即可

代码语言:javascript
复制
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
    }
}

尽管我建议你不要使用全局变量。如果可能的话,尽量避免。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53201763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档