Избавьтесь от «флага, предоставленного, но не определенного» при использовании пакета «флаг».

# #go #command-line-arguments

Вопрос:

Я создаю инструмент запроса API с помощью go и хочу использовать пакет «флаг».
Я определил флаг с помощью flag.String , но когда я ввожу флаг, которого не существует
, программа выводит «флаг предоставлен, но не определен: {флаг}» (где {флаг} — это флаг, которого не существует.)

Мой код таков:

 package main

import "fmt"
import "flag"
import "os"

func main() {
    // Set up command-line arguments
    apiRequestTool := flag.String("api", "", "")
    flag.Usage = func() {
        fmt.Fprintf(os.Stderr, "Usage: TestTestTestn")
        os.Exit(1)
    }
    flag.Parse()
    
    // Check API URL value
    if *apiRequestTool == "" {
        fmt.Println(""api" Usage: --api [string]")
        os.Exit(1)
    }
}
 

Ответ №1:

Функции, такие как flag.String и flag.Parse работают с экспортированным *flag.FlagSet одноэлементным именем flag.CommandLine . Один из способов подавления всех сообщений об ошибках из этого набора флагов состоит в перенаправлении его вывода в черную дыру (например, в верхней части вашей основной функции), как это:

 flag.CommandLine.SetOutput(io.Discard)
 

После этого сообщение об ошибке, которое вы считаете раздражающим, не будет напечатано:

 $ go run main.go --whatever
Usage: TestTestTest
exit status 1