Есть ли способ определить, был ли установлен флаг при использовании `flag.VisitAll`? - PullRequest
0 голосов
/ 21 октября 2018

Я использую нативный пакет go "flag".

В него встроена возможность посещать все текущие определенные флаги, используя flag.VisitAll.

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

Есть ли способ достичь этого без реализации новых типов параметров?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Нет функции для обхода неустановленных флагов командной строки.Однако эту функциональность можно реализовать, взяв разность между флагами, возвращаемыми VisitAll и Visit;первый обходит все флаги, а второй обходит установленные флаги:

func UnsetFlags(fs *flag.FlagSet) []*flag.Flag {
    var unset []*flag.Flag
    fs.VisitAll(func(f *flag.Flag) {
        unset = append(unset, f)
    })
    fs.Visit(func(f *flag.Flag) {
        for i, h := range unset {
            if f == h {
                unset = append(unset[:i], unset[i+1:]...)
            }
        }
    })
    return unset
}

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

for _, f := range UnsetFlags(flag.CommandLine) {
    v := os.Getenv(f.Name)
    f.Value.Set(v)
}
0 голосов
/ 21 октября 2018

Использование flag.VisitAll звучит немного запутанно;Я бы предложил получить переменную среды с нормальным значением по умолчанию и использовать ее в качестве значения флага по умолчанию - это означает, что переменная среды будет резервной, если флаг не установлен:

package main

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

func GetEnvDefault(key, def string) string {
    v := os.Getenv(key)

    if v == "" {
        return def
    }

    return v
}

func main() {
    // Uncomment to test behaviour
    // os.Setenv("SERVER_NAME", "donaldduck")

    var serverName string

    flag.StringVar(&serverName, "n", GetEnvDefault("SERVER_NAME", "mickeymouse"), "The human name for the server")
    flag.Parse()

    fmt.Println(serverName)
}

См .: https://play.golang.org/p/ixDsXH31cBF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...