ใน Go คำสั่ง break แบ่งจากสวิตช์ / เลือกหรือไม่


144

ฉันรู้ว่าswitch/ selectstatement แบ่งโดยอัตโนมัติหลังจากทุกกรณี ฉันสงสัยในรหัสต่อไปนี้:

for {
    switch sometest() {
    case 0:
        dosomething()
    case 1:
        break
    default:
        dosomethingelse()
    }
}

ที่ไม่breakคำสั่งออกจากforห่วงหรือเพียงแค่switchบล็อก?

คำตอบ:


199

แบ่งคำสั่งข้อมูลจำเพาะภาษาโปรแกรมไป

คำสั่ง "break" จะยุติการใช้คำสั่ง "in", "switch" หรือ "select" ที่อยู่ด้านในสุด

BreakStmt = "break" [ Label ] .

หากมีป้ายกำกับมันจะต้องเป็นของคำสั่ง "สำหรับ", "สลับ" หรือ "เลือก" และนี่คือป้ายกำกับที่การดำเนินการสิ้นสุดลง

L:
  for i < n {
      switch i {
      case 5:
          break L
      }
  }

ดังนั้นbreakคำสั่งในตัวอย่างของคุณจึงยุติswitchคำแถลงคำว่า "ส่วนในสุด"


4
อะไรคือกรณีการใช้breakภายในselect {}เนื่องจากcaseสามารถเลือกได้เพียงอันเดียว?
Julio Guerra

3
เนื่องจากแม้ว่าจะมีการเลือกเคสเดียวมันอาจมีการนำไปใช้ที่ยาวขึ้นซึ่งใช้ตัวแบ่งเพื่อยุติการดำเนินการของเคสเหมือนกับที่คุณสามารถกลับจากที่ใดก็ได้ในฟังก์ชั่น
Tit Petric

จะไม่เป็นการออกแบบที่ไม่ดีหรือ เพราะไปที่คำสั่งเป็นดีไซน์ที่ไม่ดีและสลับ / เลือกคำสั่งแยกโดยอัตโนมัติ
John Balvin Arias

55

ตัวอย่างที่แสดงความหวัง:

loop:
for {
        switch expr {
        case foo:
                if condA {
                        doA()
                        break // like 'goto A'
                }

                if condB {
                        doB()
                        break loop // like 'goto B'                        
                }

                doC()
        case bar:
                // ...
        }
A:
        doX()
        // ...
}

B:
doY()
// ....

14

ใช่แบ่งชั้นbreakswitch

https://play.golang.org/p/SZdDuVjic4

package main

import "fmt"

func main() {

    myloop:for x := 0; x < 7; x++ {
        fmt.Printf("%d", x)
        switch {
        case x == 1:
            fmt.Println("start")
        case x == 5:
            fmt.Println("stop")
            break myloop
        case x > 2:
            fmt.Println("crunching..")
            break
        default:
            fmt.Println("idling..")
        }
    }
}
0idling..
1start
2idling..
3crunching..
4crunching..
5stop

Program exited.


2

สิ่งนี้ควรอธิบาย

for{
    x := 1
    switch {
    case x >0:
        fmt.Println("sjus")
    case x == 1:
        fmt.Println("GFVjk")
    default:
        fmt.Println("daslkjh")
    }
}
}

ทำงานตลอดไป

for{
    x := 1
    switch {
    case x >0:
        fmt.Println("sjus")
        break
    case x == 1:
        fmt.Println("GFVjk")
    default:
        fmt.Println("daslkjh")
    }
}
}

วิ่งอีกครั้งตลอดไป

แต่

package main

import "fmt"

func main() {
d:
for{
x := 1
    switch {
    case x >0:
        fmt.Println("sjus")
        break d
    case x == 1:
        fmt.Println("GFVjk")
    default:
        fmt.Println("daslkjh")
    }
}
}

จะพิมพ์ sjus ... ชัดเจนไหม

http://play.golang.org/p/GOvnfI67ih


3
อืมฉันรวมลิงค์ไปเล่นซึ่งอาจเป็นประโยชน์
Jasmeet Singh

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.