1 回答

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊
正如上面評論中所寫,沒有工具可以做到這一點(diǎn)。
但是您可以使用一個(gè)簡單的技巧來找出答案。
你想注冊一個(gè)標(biāo)志,但你不能,因?yàn)樗呀?jīng)在其他地方(未知位置)注冊過。
如果可以先注冊,則報(bào)錯(cuò)時(shí)會(huì)報(bào)當(dāng)前注冊的地方。
怎么做?創(chuàng)建一個(gè)注冊此標(biāo)志的包:
package first
import "flag"
func init() {
flag.String("tf", "", "")
}
然后像這樣在你的包中首先導(dǎo)入這個(gè)包main:
package main
import _ "play.gorund/first"
import (
"flag"
"play.ground/foo"
)
會(huì)發(fā)生什么?首先執(zhí)行包init(),first正確注冊tf標(biāo)志,然后foo將嘗試再次執(zhí)行該操作,失敗并報(bào)告錯(cuò)誤。
示例輸出(在Go Playground上嘗試):
/tmpfs/play flag redefined: tf
panic: /tmpfs/play flag redefined: tf
goroutine 1 [running]:
flag.(*FlagSet).Var(0xc000062180, {0x4c3188, 0xc0000142a0}, {0x4a2642, 0x2}, {0x0, 0x0})
/usr/local/go-faketime/src/flag/flag.go:980 +0x2f9
flag.StringVar(...)
/usr/local/go-faketime/src/flag/flag.go:851
play.ground/foo.init.0()
/tmp/sandbox1464715048/foo/foo.go:10 +0x7d
如您所見,foo.go第 10 行注冊了tf標(biāo)志。任務(wù)完成。
筆記:
許多編輯器在保存時(shí)自動(dòng)設(shè)置格式,這可能涉及重新排列/重新組合導(dǎo)入,因此您的play.ground/first導(dǎo)入可能會(huì)向下移動(dòng),而不是第一個(gè)。為避免這種情況,請勿使用自動(dòng)格式化功能,或?yàn)榇税x擇一個(gè)在自動(dòng)格式化后將首先保留的名稱。
筆記2:
Spec: Package initialization聲明了初始化包的要求和規(guī)則,并沒有指定處理導(dǎo)入的順序(唯一保證的是所有引用的包在使用之前都會(huì)被遞歸初始化)。這意味著盡管當(dāng)前的編譯器按照列出的方式處理它們,但您不能 100% 依賴它。還有一個(gè)問題,即使是main包也有多個(gè)源文件,以不同的順序向編譯器提供它們也可能會(huì)改變初始化順序。該規(guī)范將此作為“建議”:
為了確??芍噩F(xiàn)的初始化行為,鼓勵(lì)構(gòu)建系統(tǒng)以詞法文件名順序向編譯器呈現(xiàn)屬于同一包的多個(gè)文件。
- 1 回答
- 0 關(guān)注
- 165 瀏覽
添加回答
舉報(bào)