因爲之前命令行參數是同過os.Args[1]來獲取,感覺不太科學也不美觀,所以今天改用flag去獲取。
原始代碼如下:
func GetRuntimePath() string {
var spath string
flag.StringVar(&spath, "p", " ", "這裏請務必傳入項目根目錄")
flag.Parse()
return spath
}
結果go run 時報錯,flag redefined: p。
框架使用的iris mvc框架,在router中調用了一次,另外在xorm engine的實例化方法裏面獲取config文件時也調用了一次。也就是說,在程序中多次調用了GetRuntimePath方法。
flag是不能多次調用的,所以,這裏加多一個緩存。
var Staticpath string
func GetRuntimePath() string {
if Staticpath != "" {
return Staticpath
}
var spath string
flag.StringVar(&spath, "p", " ", "這裏請務必傳入項目根目錄")
flag.Parse()
Staticpath = spath
return Staticpath
}
因爲這個命令行獲取的參數獲取到之後就不會再發生變動,所以我們使用包全局變量保存起來,第一次訪問的時候從命令行獲取,再次訪問直接就拿全局變量的值即可,這樣也不會再次出發flag的方法調用。完美解決問題。