Go

[GO] 중첩반복문 탈출 방법 : label

viviviviviid 2023. 9. 13. 00:25
Go 언어에서 중첩반복문 탈출할 수 있는 방법 : Label
1: func isOnMempool(uTxOut *UTxOut) bool {
2: 	exists := false
3: 		for _, tx := range Mempool.Txs {
4: 			for _, input := range tx.TxIns {
5: 				exists = input.TxID == uTxOut.TxID && input.Index == uTxOut.Index
6: 			}
7:		}
8:		return exists
9:	}

위 코드를 보면, 5번째 라인에서

input.TxID == uTxOut.TxID && input.Index == uTxOut.Index


이 조건이 성립할때 exists = true 가 된다는 것을 알 수 있다.

 

하지만 저 두개의 반복문이 끝까지 돌아야할 필요는 없다.

예를 들어, 총 10000번의 반복이 가능한데, 첫번째 반복에서 true로 들어가면 그 이후에는 반복문의 의미가 사라진다.

즉 탈출해야 한다는 뜻이다.

 

가장 쉽게 생각해서 true일때 break를 걸 수도 있겠지만, 그건 매 반복문마다 if문을 걸어줘야하기에 번거로울 수가 있다.

 

Label 

이 내용을 위해 블로깅한 것이라고 볼 수 있겠다.

func isOnMempool(uTxOut *UTxOut) bool {
	exists := false
Outer:
	for _, tx := range Mempool.Txs {
		for _, input := range tx.TxIns {
			if input.TxID == uTxOut.TxID && input.Index == uTxOut.Index {
				exists = true
				break Outer 
			}
		}
	}
	return exists
}

3번째 라인에서 Outer라는 label을 달았다. 이 label은 바로 다음 줄, 겉 for문을 지칭하게 된다. 

이제 실행이 되다가. if 문에서 true가 되고, break Outer가 실행되면 겉 for문을 break 하게 된다.

 

평소 기본 break는 가장 가까운 반복문이 종료되지만, break Outer와 같이 레이블을 지정해주면, 그 지정된 반복문이 종료된다.

여기서 알아둬야할 점은,

겉의 for문을 명시적으로 빠져나오게 함으로써, 실질적으로는 첫 번째와 두 번째 중첨된 for문 둘 다를 빠져나오게 되는 것이다.