Bài học theo mô-đun (3/5)
cho...phạm vi
for ... range là cách thành ngữ để lặp lại các bộ sưu tập:
lát, mảng, bản đồ, chuỗi và kênh. Cú pháp thay đổi một chút
tùy thuộc vào bộ sưu tập, nhưng mẫu cơ bản luôn giống nhau:
for key, value := range coll { ... }.
Phạm vi trên lát và mảng
Trả về chỉ mục và bản sao của giá trị:
nums := []int{10, 20, 30}
for i, v := range nums {
fmt.Println(i, v)
}
// 0 10
// 1 20
// 2 30Thường thì một trong hai là đủ:
// solo indice
for i := range nums { _ = i }
// solo valore (ignora indice con _)
for _, v := range nums { _ = v }Phạm vi trên bản đồ
Trả về khóa và giá trị:
prices := map[string]int{"pane": 2, "latte": 3, "vino": 8}
for k, v := range prices {
fmt.Println(k, v)
}Phạm vi trên một chuỗi: rune, không phải byte
for i, r := range s lặp lại mỗi điểm mã Unicode (rune), không phải mỗi
byte. Chỉ số i là độ lệch byte của phần bắt đầu của rune.
for i, r := range "èé" {
fmt.Printf("%d %c (%U)\n", i, r, r)
}
// 0 è (U+00E8)
// 2 é (U+00E9)Để lặp lại mỗi byte, hãy sử dụng lập chỉ mục cổ điển:
s := "ciao"
for i := 0; i < len(s); i++ {
fmt.Println(s[i]) // byte (uint8)
}Phạm vi trên một kênh
Lặp lại cho đến khi kênh được đóng lại:
ch := make(chan int)
go func() {
for i := 0; i < 3; i++ { ch <- i }
close(ch)
}()
for v := range ch {
fmt.Println(v)
}Chúng ta sẽ tìm hiểu sâu hơn về mô-đun Đồng thời.
Hãy thử nó
In chỉ mục và giá trị của mọi phần tử của số bằng cách sử dụng for-range.
Giải pháp khả dụng sau 3 lần thử
Tính tổng tất cả các giá trị của số bỏ qua chỉ số.
Hiển thị gợi ý
Sử dụng `_` để loại bỏ chỉ mục.
Giải pháp khả dụng sau 3 lần thử
Biến đầu tiên trong `for k, v := range m` biểu thị gì khi m là bản đồ?
m := map[string]int{"a": 1, "b": 2}
for k, v := range m { fmt.Println(k, v) }Tóm tắt lại
for k, v := range collcó phạm vi rõ ràng: loại bỏ bằng_những gì bạn không sử dụng.- Slice/array: chỉ mục + SAO CHÉP giá trị. Để thay đổi, hãy lập chỉ mục.
- Bản đồ: khóa + giá trị, thứ tự ngẫu nhiên trên mỗi lần chạy.
- Chuỗi: phạm vi lặp theo rune (điểm mã), không phải theo byte.
- Kênh: lặp lại khi kênh đang mở; đã đóng bằng
close().