2015-08-07 6 views
4

Учитывая эту простую программу Go, для которой требуется ровно один аргумент командной строки, как я могу ее улучшить, так что flag.Usage() дает полезный результат?Как печатать использование для позиционного аргумента с пакетом пакетов Go?

package main 

import (
    "flag" 
    "fmt" 
    "os" 
) 

func main() { 
    flag.Parse() 
    if len(flag.Args()) == 0 { 
     flag.Usage() 
     os.Exit(1) 
    } 

    args := flag.Args() 
    fmt.Println(args[0]) 
} 

Выходной ток без аргументов, приведенных:

$ ./args 
Usage of ./args: 

(т.е. использование пуст, так как я не могу найти способ сказать функцию использования(), которые требуются параметры).

можно удалить flag.Usage() и заменить его чем-то вроде этого:

fmt.Fprintln(os.Stderr, "Usage:", os.Args[0], "<argument>") 

Однако я не хочу изобретать велосипед, если уже есть хороший способ с flag.Usage(). Тем более, что он уже обрабатывает необязательные аргументы:

$ ./args -foo 
flag provided but not defined: -foo 
Usage of ./args: 

ответ

8

flag.Usage() только даст вам полезную информацию о определенных флагов. Таким образом, вы либо определяете свои аргументы как флаги через var foo = flag.Int(...).

Другим вариантом является определение вашего собственного обработчика использования. см. ниже для простого примера, который будет печатать пользовательское сообщение и значения по умолчанию для всех определенных флагов. Таким образом, вы внесете Usage в случае, если flag.Parse() не работает.

package main 
import (
    "flag" 
    "fmt" 
    "os" 
) 

func myUsage() { 
    fmt.Printf("Usage: %s [OPTIONS] argument ...\n", os.Args[0]) 
    flag.PrintDefaults() 
} 

func main() { 
    flag.Usage = myUsage 
    /* ... */ 
} 
+4

Спасибо, это работает. Я не уверен, почему Go не может определить позиционные аргументы, поскольку я думал, что они также будут распространены. Если бы я мог определить аргумент без имени, тогда мне не нужно было бы создавать пользовательскую функцию 'Usage()', встроенная функция могла бы обрабатывать ее вместе с другими. Тем не менее, ваше решение работает без дополнительного кода. :) – fazy

Смежные вопросы