이 글은 골든래빗 《Tucker의 Go 언어 프로그래밍》의 11장 써머리입니다.
for 초기문; 조건문; 후처리 {
//logic
}
;
를 붙여줘야 한다.for ; 조건문; 후처리 {
//logic
}
;
를 붙여줘야 한다.for 초기문; 조건문; {
//logic
}
for ; 조건문; {
//logic
}
;
도 생략 가능for 조건문 {
//logic
}
true
이면 무한루프for true {
//logic
}
true
이다.for {
//logic
}
for i := 0; i < 10; i++ {
for i == 3 {
continue // 후처리로 건너뛴다?????
}
if i == 6 {
break // for문 종료
}
fmt.Printf("6 * %v = %v", i, 6 * i)
}
for i := 2; i < 10; i++ { // 2~9 순회
for j := 1; j < 10; j++ { // 1~9 순회
fmt.Printf("%v * %v = %v\n", i, j, i*j)
}
}
for i := 0; ; i++ {
if i == 10 {
break
}
if i < 2 {
i++
continue
}
for j := 0; ; j++ {
if j == 10 {
break
}
if j < 1 || j > 9 {
j++
continue
}
fmt.Printf("%v * %v = %v\n", i, j, i*j)
}
}
for {
if flag {
fmt.Printf("%v * %v = %v\n", a, b, a*b)
break
}
a++
for {
b++
if a*b == 45 {
flag = true
break
}
fmt.Printf("%v * %v = %v\n", a, b, a*b)
if b == 9 {
b = 0
break
}
}
}
내부 for문에서 두 수의 곱이 45가 되는 경우를 찾았다면 flag
변수값을 true
로 바꾼다.
외부 for문에서 flag
값을 확인하고 true인 경우 for문을 종료한다.
flag
변수 이외에 label
을 사용할 수 있는데 아래와 같다.(동작은 위와 같음)
Gugudan:
for {
a++
for {
b++
if a*b == 45 {
fmt.Printf("%v * %v = %v\n", a, b, a*b)
break Gugudan
}
fmt.Printf("%v * %v = %v\n", a, b, a*b)
if b == 9 {
b = 0
break
}
}
}
label
은 레이블 이름을 적고 :
을 적어 정의한다.
break
할 때 레이블 이름을 적어주면 그 레이블에서 먼저 포함된 for문까지 종료하게 된다.
label
과 for문 사이에 다른것은 올 수 없다(변수, struct 등 )
label
보다는 플래그를 사용하자(플래그도 최소화 하라고 한다)
아래와 같이 함수를 사용해 중첩반복 및 레이블이 없는 깔끔한 코드로 사용하자!
func find45(a int) (int, bool) {
for b := 1; b <= 9; b++ {
if a*b == 45 {
return b, true
}
}
return 0, false
}
func Test_bestPractice(t *testing.T) {
a := 1
b := 0
for ; a <= 9; a++ {
var found bool
if b, found = find45(a); found {
break
}
}
fmt.Printf("%v * %v = %v\n", a, b, a*b)
}