main flag redefined: graceful


beego項目新增一個api的校驗功能結果運行導致panic

/var/folders/3p/jc3w8_dn5dd0r5_5ccp3nrqm0000gn/T/go-build935260114/b001/exe/main flag redefined: graceful
panic: /var/folders/3p/jc3w8_dn5dd0r5_5ccp3nrqm0000gn/T/go-build935260114/b001/exe/main flag redefined: graceful

goroutine 1 [running]:
flag.(*FlagSet).Var(0xc0000862a0, 0x18aaa20, 0x1d40069, 0x17b06d5, 0x8, 0x17c3eac, 0x21)
        /usr/local/Cellar/go/1.13.8/libexec/src/flag/flag.go:848 +0x4ae
flag.BoolVar(...)
        /usr/local/Cellar/go/1.13.8/libexec/src/flag/flag.go:627
github.com/astaxie/beego/grace.init.0()
        /Users/dxm/Documents/code/gopath/src/github.com/astaxie/beego/grace/grace.go:93 +0x7a
exit status 2

 /usr/local/Cellar/go/1.13.8/libexec/src/flag/flag.go:848 +0x4ae

定位到panic的代碼

 

 

panic的原因是 graceful這個flag被定義了兩遍,全局搜索定義此變量的代碼位置,果然找到了兩處,

來自不同目錄下的兩個相同的外部包,均在項目中被引用,所以導致了panic

相同的外部包一個從vendor中導入一個從$GOPATH 導入的具體原因是:

公共類的包A同時存在在$GOPATH下的B包下和Vendor下的C包下,B和C均在項目中被引用,

由於以下原因導致了panic:

  • 包導入時首先從vendor中導入然后再看$GOPATH
  • C中所依賴的所有外部包的導入路徑均會繼承C的路徑,B同理
  • C在vendor中不存在

解決方法

將C拷貝到vendor下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM