Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to break out of nested loops in Go?

Tags:

loops

go

I have an outer and inner loop, each iterating over a range. I want to exit the outer loop when a condition is satisfied inside the inner loop.

I have a solution which works using two 'break's, one inside the inner loop and one inside the outerloop, just outside the inner loop (a very simplified case for demonstration):

package main  import (     "fmt" )  func main() {      word := ""     for _, i := range("ABCDE") {         for _,j := range("ABCDE") {             word = string(i) + string(j)             fmt.Println(word)             if word == "DC" {                 break             }         }         if word == "DC" {             break         }     }     // More logic here that needs to be executed } 

Go Playground

There is no problem with this solution, but it just looks patched and ugly to me. Is there a better way to do this?

I can try and have another for conditional loop outside the outer loop in the previous solution and have a label and use continue with the label. But as you can see, this approach isn't any more elegant than the solution with break.

package main  import (     "fmt" )  func main() {      word := ""  Exit:     for word != "DC" {         for _, i := range "ABCDE" {             for _, j := range "ABCDE" {                 word = string(i) + string(j)                 fmt.Println(word)                 if word == "DC" {                     continue Exit                 }             }         }     }     // More logic here that needs to be executed } 

Go Playground

I have seen similar questions here pertaining to other languages (C, C#, Python etc). But what I am really interested to see is whether there is any trick with Go constructs such as 'for select'.

like image 958
Jay Avatar asked Aug 24 '18 01:08

Jay


People also ask

How do you break out of a loop in Go?

In Go, the break statement terminates execution of the current loop. A break is almost always paired with a conditional if statement. This small program creates a for loop that will iterate while i is less than 10 . Within the for loop, there is an if statement.

How do you escape nested loops?

Using break in a nested loop In a nested loop, a break statement only stops the loop it is placed in. Therefore, if a break is placed in the inner loop, the outer loop still continues. However, if the break is placed in the outer loop, all of the looping stops.


2 Answers

Use break {label} to break out of any loop as nested as you want. Just put the label before the for loop you want to break out of. This is fairly similar to the code that does a goto {label} but I think a tad more elegant, but matter of opinion I guess.

package main  func main() {     out:     for i := 0; i < 10; i++ {         for j := 0; j < 10; j++ {             if i + j == 20 {                 break out             }         }     } } 

More details: https://www.ardanlabs.com/blog/2013/11/label-breaks-in-go.html

like image 126
lazieburd Avatar answered Sep 19 '22 07:09

lazieburd


use function

package main  import (     "fmt" )  func getWord() string {     word := ""     for word != "DC" {         for _, i := range "ABCDE" {             for _, j := range "ABCDE" {                 word = string(i) + string(j)                 fmt.Println(word)                 if word == "DC" {                     return word                 }             }         }     }     return word }  func main(){     word := getWord() } 

Edit: thanks to @peterSO who points on some mistakes in the details and provides this playground https://play.golang.org/p/udcJptBW9pQ

like image 33
kkesley Avatar answered Sep 19 '22 07:09

kkesley