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문 둘 다를 빠져나오게 되는 것이다.