亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在不同范圍內使用多個同名變量是否有合理的用例?

在不同范圍內使用多個同名變量是否有合理的用例?

Go
海綿寶寶撒 2022-12-19 21:05:21
以下(設計的)代碼定義了變量 i 的兩次出現或“實例”:import "fmt"func main() {    goto_done := false    i := 3fred:    fmt.Printf("i #1 = %d\n", i)    if !goto_done {        i := 4        fmt.Printf("i #2 = %d\n", i)        goto_done = true        goto fred    }}從輸出中可以看出,這兩個值都作為單獨的值存在,因為定義第二個值不會覆蓋第一個值:i #1 = 3i #2 = 4i #1 = 3此功能是否有任何建設性的用例,或者它只是語言的一個怪癖?
查看完整描述

1 回答

?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

以下是一些用例:


1.關閉

Go 有閉包,這意味著你可以創建一個引用封閉變量的匿名函數。閉包有很多很好的用途,但這意味著匿名函數會繼承它們的封閉變量名。


err := trySomething()


workChan := make(chan work)


// start a worker

go func() {

    // we're using the existing workChan from the enclosing scope

    for job := range workChan {

        //  vv this is name shadowing! (we're shadowing the existing err)

        err := do(job)

        if err != nil {

            logError(err) 

        }

    }

}()


err = tryAnotherThing()

if err != nil {

    return err

}


如果我們不能隱藏名稱,那么工作線程和主線程將競爭使用同一個err變量(導致未定義的行為)。因此,您可以感謝陰影,因為您不必鍵入err2、errr等。


2. 在封閉范圍內添加新名稱

假設你有一個現有的包,你想添加一個新的全局常量或變量,名為gopher. 您不想搜索整個包源中的每個范圍以查看該名稱gopher是否已在任何地方使用。


在Go 1.18版本中,添加了兩個新的預聲明標識符:any和comparable。由于允許名稱隱藏,因此可以將像這樣的通用標識符添加到 Go 而不會破壞以前正確的 Go 程序(另請參見Go 1 兼容性聲明)


3.粘貼代碼

Shadowing 允許您像這樣復制和粘貼“自包含”代碼,并使其在您放置的任何地方(幾乎)都能正常工作。


// Print Fibonacci numbers

for i, j := 0, 1; j < 100; i, j = j, i+j {

    fmt.Println(j)

}

i并且j是非常常見的變量名稱,因此如果不允許隱藏,則如果您嘗試將其粘貼到代碼中的某處,很可能會發生沖突,從而導致錯誤。


當然,通常最好避免隱藏,因為它會導致意想不到的錯誤并降低代碼的可讀性(尤其是在沒有 IDE 中可能會出現的范圍感知突出顯示的情況下)。在更長、更現實的場景中,您可能想要重命名您可能粘貼的任何陰影名稱。值得慶幸的是,陰影在語言中是有效的,它實際上應該更容易重命名它們:


由于i和j是有效且不同的變量,一個好的 IDE 應該允許您像對待任何其他變量一樣快速重命名這些變量及其所有用法。


查看完整回答
反對 回復 2022-12-19
  • 1 回答
  • 0 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號