range là cú pháp duy nhất để iterate qua collection trong Go, hoạt động khác nhau theo từng kiểu dữ liệu:
- Slice / array:
for i, v := range slice { }— trả về index và value. - Map:
for k, v := range m { }— trả về key và value, thứ tự không xác định. - String:
for i, r := range "hello" { }— trả về byte index và rune (Unicode code point). - Channel:
for v := range ch { }— đọc đến khi channel close. - Integer (Go 1.22+):
for i := range 10 { }— range over integer, tương đươngfor i := 0; i < 10; i++. - Bỏ qua giá trị: dùng blank identifier —
for _, v := range items { }.
Lưu ý: range copy value sang biến loop, không phải reference. Nếu cần mutate phần tử, dùng slice[i] thay vì v.
range is Go's only iteration syntax, with different semantics per collection type:
- Slice / array:
for i, v := range slice { }— yields index and value. - Map:
for k, v := range m { }— yields key and value; order is unspecified. - String:
for i, r := range "hello" { }— yields byte index and rune (Unicode code point). - Channel:
for v := range ch { }— reads until the channel is closed. - Integer (Go 1.22+):
for i := range 10 { }— range over integer, equivalent tofor i := 0; i < 10; i++. - Discard a value: use the blank identifier —
for _, v := range items { }.
Pitfall: range copies values into the loop variable; it is not a reference. To mutate elements, use slice[i] instead of v.