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 應該允許您像對待任何其他變量一樣快速重命名這些變量及其所有用法。
- 1 回答
- 0 關注
- 101 瀏覽
添加回答
舉報