亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法確定使用 `flag.VisitAll` 時是否設置了標志?

有沒有辦法確定使用 `flag.VisitAll` 時是否設置了標志?

Go
ITMISS 2023-04-24 16:43:48
我正在使用 go 的原生"flag"包。它內置了訪問所有當前定義的標志的能力,使用flag.VisitAll.我正在嘗試構建一個片段,該片段試圖從環境變量中獲取該標志的值(如果存在)并且以防未設置該標志,并且我找不到確定是否設置了特定標志的方法或不。有沒有辦法在不實現新參數類型的情況下實現這一目標?
查看完整描述

2 回答

?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

使用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)

}


查看完整回答
反對 回復 2023-04-24
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

沒有遍歷未設置的命令行標志的功能。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)

}


查看完整回答
反對 回復 2023-04-24
  • 2 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號