1 回答

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊
如果有多個(gè)程序包調(diào)用flag.Parse,而不必?fù)?dān)心其他程序包定義了其他標(biāo)志,那么您就很麻煩(就像您已經(jīng)體驗(yàn)到的那樣)?!皹?biāo)志”包的狀態(tài)是全局狀態(tài),因此它幾乎相同,就好像不同的包將在初始化期間競爭將全局變量的值設(shè)置為不同的值一樣。顯然,這可能不會很好地結(jié)束。
防止這種情況的簡單方法:flag.Parse
應(yīng)該只調(diào)用一次(在第一次近似中)。這就是通常只在軟件包“ main”中看到它的原因。如果您的非主程序包調(diào)用,flag.Parse
則通常會與flag.Parse
“主”程序包中的任何調(diào)用沖突。注意,go test
合成一個(gè)package main
以便測試包和flag.Parse
被從該合成“主”包調(diào)用。
另一方面,僅在非主程序包中定義標(biāo)志并依靠flag.Parse
其在程序包“主程序”中進(jìn)行調(diào)用會更“安全”(但仍然可能發(fā)生沖突)。在非主程序包中,然后可以flag.Parse
使用flag.Parsed()驗(yàn)證已被調(diào)用。
上面寫的是簡化的。有關(guān)其他選項(xiàng),請查看包裝標(biāo)志文檔。在某些情況下,例如,可以使用flag.Flagset獲得更多的“力量” ,即,通過對包中的標(biāo)志選項(xiàng)使用本地狀態(tài)。
但是,我個(gè)人不希望以任何方式在包“ main”之外使用包“ flag”,而是通過其API設(shè)置任何可配置的包行為。但是,確實(shí)存在例外,例如在* _test文件或其他特殊情況下。
- 1 回答
- 0 關(guān)注
- 293 瀏覽
添加回答
舉報(bào)