1 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
以下是一些用例:
1.關(guān)閉
Go 有閉包,這意味著你可以創(chuàng)建一個(gè)引用封閉變量的匿名函數(shù)。閉包有很多很好的用途,但這意味著匿名函數(shù)會(huì)繼承它們的封閉變量名。
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
}
如果我們不能隱藏名稱,那么工作線程和主線程將競爭使用同一個(gè)err變量(導(dǎo)致未定義的行為)。因此,您可以感謝陰影,因?yàn)槟槐劓I入err2、errr等。
2. 在封閉范圍內(nèi)添加新名稱
假設(shè)你有一個(gè)現(xiàn)有的包,你想添加一個(gè)新的全局常量或變量,名為gopher. 您不想搜索整個(gè)包源中的每個(gè)范圍以查看該名稱gopher是否已在任何地方使用。
在Go 1.18版本中,添加了兩個(gè)新的預(yù)聲明標(biāo)識符:any和comparable。由于允許名稱隱藏,因此可以將像這樣的通用標(biāo)識符添加到 Go 而不會(huì)破壞以前正確的 Go 程序(另請參見Go 1 兼容性聲明)
3.粘貼代碼
Shadowing 允許您像這樣復(fù)制和粘貼“自包含”代碼,并使其在您放置的任何地方(幾乎)都能正常工作。
// Print Fibonacci numbers
for i, j := 0, 1; j < 100; i, j = j, i+j {
fmt.Println(j)
}
i并且j是非常常見的變量名稱,因此如果不允許隱藏,則如果您嘗試將其粘貼到代碼中的某處,很可能會(huì)發(fā)生沖突,從而導(dǎo)致錯(cuò)誤。
當(dāng)然,通常最好避免隱藏,因?yàn)樗鼤?huì)導(dǎo)致意想不到的錯(cuò)誤并降低代碼的可讀性(尤其是在沒有 IDE 中可能會(huì)出現(xiàn)的范圍感知突出顯示的情況下)。在更長、更現(xiàn)實(shí)的場景中,您可能想要重命名您可能粘貼的任何陰影名稱。值得慶幸的是,陰影在語言中是有效的,它實(shí)際上應(yīng)該更容易重命名它們:
由于i和j是有效且不同的變量,一個(gè)好的 IDE 應(yīng)該允許您像對待任何其他變量一樣快速重命名這些變量及其所有用法。
- 1 回答
- 0 關(guān)注
- 82 瀏覽
添加回答
舉報(bào)