Флаг в Go - должен ли я всегда устанавливать значение по умолчанию?

Возможно ли установить значение по умолчанию в пакете флага в Go? Например, в пакете флагов вы можете написать следующую строку:

filename := flag.String("file", "test.csv", "Filename to cope with")

В приведенном выше коде я не хочу обязательно устанавливать значение по умолчанию, которое в этом случае равно test.csv, и вместо этого всегда заставляет пользователей указывать собственное имя файла, а если оно не указано, то я хочу вызвать ошибку и выйдите из программы.

Один из способов, которым я пришел, - это сначала проверить значение filename после выполнения flag.Parse(), и если это значение test.csv, то у меня будет выход программы с соответствующим сообщением об ошибке. Тем не менее, я не хочу писать такой избыточный код, если его можно уклониться - и даже если это не удастся, я хотел бы услышать лучший способ справиться с проблемой здесь.

Вы можете делать эти операции в модуле Python argparse, кстати, я просто хочу реализовать подобное, если могу...

Кроме того, могу ли я реализовать как короткие, так и длинные аргументы (другими словами, как -f, так и -file аргумент?) в пакете флага?

Спасибо.

Ответ 1

Я думаю, что идиоматично создавать значения вашего флага таким образом, что подразумевает "нет", когда они равны нулевому значению их соответствующих типов. Например:

optFile := flag.String("file", "", "Source file")
flag.Parse()
fn := *optFile
if fn == "" {
        fn = "/dev/stdin"
}
f, err := os.Open(fn)
...

Объявление второго вопроса: IINM, пакет флагов по дизайну не различает -flag и --flag. IOW, вы можете установить как -f, так и --file в свой флаг и записать любую версию - или -- перед f и file. Однако, учитывая другой флаг -g, пакет флага не распознает -gf foo как равный -g -f foo.

Ответ 2

Когда у меня есть флаг, который не может иметь значение по умолчанию, я часто использую значение REQUIRED или что-то подобное. Я нахожу, что это облегчает чтение --help.

Что касается того, почему он не запекался, я подозреваю, что это просто не считалось достаточно важным. Значение по умолчанию не подходит для всех потребностей. Однако флаг --help аналогичен; он не подходит для всех потребностей, но он достаточно хорош в большинстве случаев.

Чтобы не сказать, что нужные флаги - плохая идея. Если вы достаточно увлечены, пакет flagutil может быть приятным. Оберните текущий flag api, make Parse верните ошибку, которая описывает отсутствующий флаг, и добавьте RequiredInt и RequiredIntVar и т.д. Если это окажется полезным/популярным, оно может быть объединено с официальным flag пакет.