Skip to content

การควบคุมลูปใน Go

ใน Go มีคำสั่งลูปเพียงแบบเดียว for Go ทิ้งคำสั่ง while ไป คำสั่ง for สามารถใช้เป็น while ได้

for

รูปแบบคำสั่งดังนี้

go
for init statement; expression; post statement {
  execute statement
}

เมื่อเก็บเฉพาะเงื่อนไขลูปไว้ จะกลายเป็น while

go
for expression {
  execute statement
}

นี่คือลูปไม่มีที่สิ้นสุด ไม่มีทางออก

go
for {
  execute statement
}

ตัวอย่าง

นี่คือโค้ดที่เอาต์พุตตัวเลขในช่วง [0,20]

go
for i := 0; i <= 20; i++ {
    fmt.Println(i)
}

คุณสามารถเริ่มต้นตัวแปรหลายตัวพร้อมกัน แล้วเพิ่มค่าพวกมัน

go
for i, j := 1, 2; i < 100 && j < 1000; i, j = i+1, j+1 {
  fmt.Println(i, j)
}

ใช้เป็น while

go
num := 1
for num < 100 {
    num *= 2
}

ลูปคู่พิมพ์ตารางสูตรคูณเก้า นี่เป็นกรณีลูปแบบคลาสสิก

go
func main() {
  for i := 1; i <= 9; i++ {
    for j := 1; j <= 9; j++ {
      if i <= j {
        fmt.Printf("%d*%d = %2d  ", i, j, i*j)
      }
    }
    fmt.Println()
  }
}

เอาต์พุตดังนี้

go
1*1 =  1  1*2 =  2  1*3 =  3  1*4 =  4  1*5 =  5  1*6 =  6  1*7 =  7  1*8 =  8  1*9 =  9
2*2 =  4  2*3 =  6  2*4 =  8  2*5 = 10  2*6 = 12  2*7 = 14  2*8 = 16  2*9 = 18
3*3 =  9  3*4 = 12  3*5 = 15  3*6 = 18  3*7 = 21  3*8 = 24  3*9 = 27
4*4 = 16  4*5 = 20  4*6 = 24  4*7 = 28  4*8 = 32  4*9 = 36
5*5 = 25  5*6 = 30  5*7 = 35  5*8 = 40  5*9 = 45
6*6 = 36  6*7 = 42  6*8 = 48  6*9 = 54
7*7 = 49  7*8 = 56  7*9 = 63
8*8 = 64  8*9 = 72
9*9 = 81

for range

for range สามารถใช้วนซ้ำโครงสร้างข้อมูลที่วนซ้ำได้สะดวกกว่า เช่น อาร์เรย์ สไลซ์ สตริง แมป แชนเนล รูปแบบคำสั่งดังนี้

go
for index, value := range iterable {
  // body
}

index คือดัชนีของโครงสร้างข้อมูลที่วนซ้ำได้ value คือค่าที่ดัชนีนั้น เช่น ใช้ for range วนซ้ำสตริง

go
func main() {
   sequence := "hello world"
   for index, value := range sequence {
      fmt.Println(index, value)
   }
}

for range ยังสามารถวนซ้ำค่าจำนวนเต็มได้ ค่าตัวอักษร ค่าคงที่ ตัวแปรล้วนใช้ได้

go
for i := range 10 {
    fmt.Println(i)
}

n := 10
for i := range n {
    fmt.Println(i)
}

const n = 10
for i := range n {
  fmt.Println(i)
}

สำหรับโครงสร้างข้อมูลแต่ละประเภท การดำเนินการของ for range แตกต่างกันบ้าง ต่อไปจะกล่าวถึง คุณสามารถไปที่ Go - for statement เพื่อดูรายละเอียดเพิ่มเติม

break

คีย์เวิร์ด break จะยุติลูป for ด้านในสุด เมื่อใช้ร่วมกับป้ายกำกับสามารถบรรลุผลในการยุติลูปด้านนอกได้ ตัวอย่างดังนี้ นี่คือลูปคู่

go
func main() {
  for i := 0; i < 10; i++ {
    for j := 0; j < 10; j++ {
      if i <= j {
        break
      }
      fmt.Println(i, j)
    }
  }
}

เอาต์พุต

1 0
2 0
2 1
3 0
3 1
3 2
...
9 6
9 7
9 8

ใช้ป้ายกำกับเพื่อขัดจังหวะลูปด้านนอก

go
func main() {
Outer:
  for i := 0; i < 10; i++ {
    for j := 0; j < 10; j++ {
      if i <= j {
        break Outer
      }
      fmt.Println(i, j)
    }
  }
}

เอาต์พุต

continue

คีย์เวิร์ด continue จะข้ามการวนซ้ำปัจจุบันของลูปด้านในสุด直接进入การวนซ้ำครั้งต่อไป เมื่อใช้ร่วมกับป้ายกำกับสามารถบรรลุผลในการข้ามลูปด้านนอกได้ ตัวอย่างดังนี้

go
func main() {
  for i := 0; i < 10; i++ {
    for j := 0; j < 10; j++ {
      if i > j {
        continue
      }
      fmt.Println(i, j)
    }
  }
}

เอาต์พุต

0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
...
7 7
7 8
7 9
8 8
8 9
9 9

ใช้ป้ายกำกับ

go
func main() {
Out:
  for i := 0; i < 10; i++ {
    for j := 0; j < 10; j++ {
      if i > j {
        continue Out
      }
            fmt.Println(i, j)
    }
  }
}

เอาต์พุต

0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9

Golang by www.golangdev.cn edit