Объявление глобальной переменной без значения в go - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть программа, которая требует 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], если пользователи хотят использовать только функцию validate. Помещение функции clientSet в main() приведет к поломке моей функции foo(), и я не могу объявить переменную с пустым значением.

Поэтому я хочу, чтобы мои пользователи могли без проблем запускать go run main.go validate и go run main.go sync production.

* Производство - произвольное значение

Я мог бы попросить своих пользователей запустить go run main.go validate _, чтобы решить эту проблему, но это было бы не изящно. Как лучше всего решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Я даже не вижу необходимости в глобальной переменной в этом случае. Вы можете просто заставить функцию синхронизации принимать 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 в функцию синхронизации, так как это позволит избежать глобальных переменных.

0 голосов
/ 08 ноября 2018

Просто используйте len (os.Args) function

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 голосов
/ 08 ноября 2018

Ответ часто заключается в том, чтобы не использовать глобалы. Вместо этого foo возьмите аргумент foo(clientSet ClientSet) и создайте его экземпляр только в случае необходимости.

...