Chuyển đến nội dung chính
Mô-đun 2 · Bài học 3 trong tổng số 58/50 trong khóa học~10 min
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ị:

Go
nums := []int{10, 20, 30}
for i, v := range nums {
    fmt.Println(i, v)
}
// 0 10
// 1 20
// 2 30

Thường thì một trong hai là đủ:

Go
// 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ị:

Go
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.

Go
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:

Go
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:

Go
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ó

tập thể dục#go.m2.l3.e1
Nỗ lực: 0Đang tải…

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.

Đang tải trình chỉnh sửa…

Giải pháp khả dụng sau 3 lần thử

tập thể dục#go.m2.l3.e2
Nỗ lực: 0Đang tải…

Tính tổng tất cả các giá trị của số bỏ qua chỉ số.

Đang tải trình chỉnh sửa…
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ử

Quiz#go.m2.l3.e3
Sẵn sàng

Biến đầu tiên trong `for k, v := range m` biểu thị gì khi m là bản đồ?

Go
m := map[string]int{"a": 1, "b": 2}
for k, v := range m { fmt.Println(k, v) }
Tùy chọn trả lời

Tóm tắt lại

  • for k, v := range coll có 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().