第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

go:識別“標(biāo)志重新定義”的包

go:識別“標(biāo)志重新定義”的包

Go
慕標(biāo)琳琳 2023-02-06 18:59:13
如果一個(gè)標(biāo)志被重新定義,go 只會(huì)告訴標(biāo)志被重新定義的地方之一。有沒有辦法確定另一個(gè)標(biāo)志的定義位置?舉個(gè)例子,看下面的程序。在此處foo.go,定義了第一個(gè)標(biāo)志。假設(shè)我試圖在 package 中添加一個(gè)具有相同名稱的標(biāo)志main,go panic 告訴我該標(biāo)志已經(jīng)定義(因?yàn)?packagefoo首先被初始化)并且我正在 package 中重新定義它main。這是一個(gè)簡單的例子,但在一個(gè)大型代碼庫中,標(biāo)志可以在導(dǎo)入的庫中定義,很難找出標(biāo)志是在哪里第一次定義的。有什么辦法可以找出來嗎?package mainimport (    "flag"    "play.ground/foo")func main() {    var tf string    flag.StringVar(&tf, "tf", "", "")    foo.Bar()}-- go.mod --module play.ground-- foo/foo.go --package fooimport (    "flag"    "fmt")func init() {    var tf string    flag.StringVar(&tf, "tf", "", "")}func Bar() {    fmt.Println("This function lives in an another file!")}恐慌:/tmpfs/play flag redefined: tfpanic: /tmpfs/play flag redefined: tfgoroutine 1 [running]:flag.(*FlagSet).Var(0xc0000960c0, {0x4c3148, 0xc0000980a0}, {0x4a2642, 0x2}, {0x0, 0x0})    /usr/local/go-faketime/src/flag/flag.go:980 +0x2f9flag.StringVar(...)    /usr/local/go-faketime/src/flag/flag.go:851main.main()    /tmp/sandbox3734065722/prog.go:11 +0x7dProgram exited.游樂場:https ://go.dev/play/p/jsmMcnEO2hy
查看完整描述

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è)文件。


查看完整回答
反對 回復(fù) 2023-02-06
  • 1 回答
  • 0 關(guān)注
  • 165 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號