Định nghĩa về Shadowed variable
shadow nghĩa là cái bóng
, còn shadowed có nghĩa là che khuất
. Trong lập trình thì shadowed variable nghĩa là hiện tượng một biến ở scope bên ngoài bị che khuất do có một biến cùng tên được khai báo trong scope nhỏ hơn.
Scope nghĩa là vùng ảnh hưởng của biến, là phạm vi nằm trong cặp dấu ngoặc nhọn {}
Ví dụ về Shadowed variable
1
2
3
4
5
6
7
8
9
10
11
12
package main
import "fmt"
func main() {
n := 1000
if true {
n := 1
n--
}
fmt.Println(n)
}
Ở ví dụ này, thoạt nhìn có thể chúng ta sẽ nhầm tưởng kết quả chương trình trả về là 0
, bởi vì trong khối lệnh if chúng ta khai báo n := 1
và sau đó trừ đi 1 nên tưởng là sẽ bằng 0.
Tuy nhiên khi chạy chương trình thì kết quả sẽ là 1000
.
Giải thích
Ở ví dụ trên, chúng ta đã khai báo biến n ở dòng thứ 6 và gán giá trị 1000, sau đó ở dòng thứ 8 chúng ta lại khai báo một biến trùng tên n, và gán giá trị 1.
Trong trường hợp này biến n được khai báo ở bên ngoài khối lệnh if sẽ bị che khuất, do đó tất cả những xử lý với biến n bên trong khối lệnh if sẽ chỉ tác dụng với biến n được khai báo bên trong khối lệnh này thôi. Tiếp theo ở dòng thứ 11, chúng ta in ra giá trị của n, và n ở đây chính là biến n chúng ta khai báo và gán giá trị là 1000 ở dòng thứ 6
Để tránh những sai xót không đáng có, chúng ta có thể dùng những Linting tool như golangci-lint
hoặc go vet
để tự động kiểm tra lỗi nhé.