Theo truyền thống, Golang thường phát hành phiên bản mới mỗi sáu tháng. Vào ngày 6 tháng 2 năm 2024, đúng sáu tháng sau khi ra mắt phiên bản 1.21, Golang đã chính thức tung ra phiên bản 1.22. Trong số các cải tiến về ngôn ngữ, phiên bản 1.22 đã thực hiện hai thay đổi đáng chú ý đối với cấu trúc for loop.
Hãy cùng khám phá ngay hai thay đổi này:
Không còn chia sẻ biến vòng lặp
Từ trước phiên bản Go 1.22, biến được khai báo trong vòng lặp for chỉ được tạo một lần và giá trị của nó sẽ được cập nhật trong mỗi lần lặp. Tuy nhiên, từ Go 1.22 trở đi, mỗi lần lặp sẽ tạo ra một biến mới hoàn toàn.
Hỗ trợ duyệt qua số nguyên bằng range
Go 1.22 nay đã cho phép sử dụng range để duyệt qua các số nguyên trực tiếp trong vòng lặp for.
Dưới đây là ví dụ mã nguồn minh họa cách sử dụng hai thay đổi trên.
1. Không còn chia sẻ biến vòng lặp
Tình huống trước Go 1.22
Trước bắn cá đổi thẻ cào khi Go 1.22 ra đời, cách viết thông thường của vòng lặp for có thể gây ra vấn đề liên quan đến việc chia sẻ biến vòng lặp. Dưới đây là ví dụ cụ thể:
Mã trên chạy vòng lặp for ba lần và khởi động một goroutine để in giá trị của biến i trong mỗi lần lặp. Do goroutine chính sẽ thoát nếu tất cả các con đều kết thúc, chúng ta thêm thời gian chờ 3 giây ở cuối hàm main để đảm bảo rằng tất cả các goroutine con đều hoàn thành công việc.
Khi chạy đoạn mã này, bạn sẽ nhận thấy kết quả không phải là 0, 1, 2 (thứ tự không quan trọng), mà rất có thể là ba lần xuất giá trị 2. Tại sao lại như vậy? Lý do nằm ở việc biến i chỉ được khai báo một lần trong khối khởi tạo của vòng lặp for, và giá trị của nó được cập nhật tại mỗi lần lặp. Kết quả là, mặc dù các goroutine con được kích hoạt theo thứ tự, nhưng chúng truy cập vào cùng một địa chỉ bộ nhớ, dẫn đến kết quả giống nhau.
Vấn đề tương tự cũng xảy ra khi sử dụng cấu trúc for range. Hãy xem đoạn mã sau:
Đoạn mã trên sử dụng for range để duyệt qua một slice, và khởi động một goroutine con để in từng phần tử. Để đảm bảo rằng tất cả các goroutine con đều hoàn thành trước khi chương trình kết thúc, chúng ta sử dụng kênh chan thay vì phương pháp ngủ thô sơ xèng như trước đó.
Tương tự như ví dụ đầu tiên, kết quả in ra sẽ không phải là các phần tử của slice mà có thể là một giá trị lặp lại nhiều lần, chứng tỏ rằng for range cũng gặp phải vấn đề chia sẻ biến vòng lặp.
Giải pháp trước Go 1.22
Để giải quyết vấn đề này trước Go 1.22, bạn có thể áp dụng một trong hai cách sau:
Từ Go 1.22, mỗi lần lặp sẽ tạo ra một nạp tiền bằng thẻ game w88 biến mới hoàn toàn (tương tự cách làm thứ hai ở trên). Vì vậy, bạn không cần sửa đổi mã nguồn, chỉ cần nâng cấp lên Go 1.22 là các lỗi liên quan sẽ tự động được khắc phục.
2. Hỗ trợ duyệt qua số nguyên bằng range
Trước Go 1.22, cấu trúc for chỉ hỗ trợ duyệt qua các kiểu dữ liệu như mảng (array hoặc slice), chuỗi (string), từ điển (map) và kênh (channel). Từ phiên bản Go 1.22, bạn có thể sử dụng range để duyệt qua các số nguyên, giúp việc tạo ra dãy số liên tục trở nên đơn giản hơn.
Như vậy, bài viết đã liệt kê và minh họa hai thay đổi quan trọng của vòng lặp for trong Golang 1.22. Mã nguồn đầy đủ đã được tải lên GitHub cá nhân của tôi, mời bạn theo dõi hoặc fork.
[1] Go 1.22 Release Notes | The Go Programming Language - go.dev
[2] Go 1.22 is released! | The Go Blog - go.dev/blog
[3] Go 1.22 đưa ra hai cải tiến lớn đối với vòng lặp for | WeChat Official Accounts Platform - mp.weixin.qq.com