Go goto 문 사용법

GolangBeginner
지금 연습하기

소개

분기문과 루프문에 비해 goto 문은 더 유연합니다. 동일한 함수 내에서 무조건적인 점프를 수행할 수 있게 해줍니다. goto는 과도하게 사용될 경우 코드 가독성을 떨어뜨릴 수 있지만, 주요 장점은 유연성에 있습니다. 적절하게 사용하면 프로그램 효율성을 향상시킬 뿐만 아니라 특정 시나리오에서 코드를 더 간결하고 우아하게 만들 수 있습니다.

이 랩에서는 Go 에서 goto 문을 사용하는 기본 사항과 break 문 대체, 루프 구현, 중첩 루프 종료 등 다양한 시나리오에서의 적용 방법을 배우게 됩니다.

지식 포인트:

  • goto의 구문 및 사용법
  • Go 프로그램에서 goto의 실용적인 적용
이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 100%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

goto 구문 이해

goto의 구문은 다음과 같습니다.

// Syntax 1: Jumping forward
goto label
...
label: code block

// Syntax 2: Jumping backward
label: code block
goto label

Go 에서 goto는 코드 내에서 앞뒤로 모두 점프할 수 있어 유연성을 제공합니다. 레이블은 프로그램 제어가 점프해야 하는 위치를 식별하는 마커입니다. 레이블은 대소문자를 구분하며, 가독성을 높이기 위해 레이블에 대문자를 사용하는 것이 좋습니다.

참고: 레이블의 선언과 사용은 모두 동일한 함수 내에서 발생해야 합니다.

예시: 간단한 goto 프로그램

goto 사용법을 보여주는 간단한 프로그램을 살펴보겠습니다. 이 예제에서는 프로그램이 특정 줄을 건너뛰고 레이블로 직접 점프합니다.

  1. 다음 명령을 실행하여 goto.go라는 새 Go 파일을 생성합니다.
cd ~/project
touch goto.go
  1. 파일을 열고 다음 코드를 작성합니다.
package main

import "fmt"

func main() {
    fmt.Println(1)  // Prints the number 1
    goto NEXT        // Jumps to the label "NEXT"
    fmt.Println(2)  // This line is skipped
NEXT:
    fmt.Println(3)  // Prints the number 3
}
  • 프로그램은 숫자 1을 출력하는 것으로 시작합니다.
  • 그런 다음 goto NEXT 문을 만나 즉시 NEXT 레이블로 점프합니다.
  • 결과적으로 fmt.Println(2) 줄은 건너뛰고 프로그램은 NEXT 레이블부터 실행을 재개하여 숫자 3을 출력합니다.
  1. 프로그램을 실행합니다.
go run goto.go
  1. 출력을 확인합니다.
1
3

이 간단한 예제는 goto를 사용하여 프로그램 흐름을 간단하게 제어하는 방법을 보여줍니다.

break 문을 goto 문으로 대체하기

특정 상황에서 goto는 루프에서 break 문을 대체하여 특정 조건에 따라 루프를 종료하는 유연성을 제공할 수 있습니다.

예시: goto를 사용하여 루프 종료하기

  1. break_with_goto.go라는 새 Go 파일을 생성합니다.
cd ~/project
touch break_with_goto.go
  1. 파일에 다음 코드를 작성합니다.
package main

import "fmt"

func main() {
    for i := 0; ; i++ {         // An infinite loop
        if i == 10 {            // Condition to exit the loop
            goto END            // Jump to the "END" label
        }
        fmt.Print(i)            // Print the current value of i
    }
END:
    fmt.Println("END")          // Print "END" after exiting the loop
}
  • 프로그램은 for i := 0; ; i++로 무한 루프를 시작합니다.
  • 루프 내부에서 i10과 같은지 확인합니다. 참이면 END 레이블로 점프하여 효과적으로 루프를 종료합니다.
  • 점프하기 전에 0부터 9까지의 i 값을 출력합니다.
  • 루프를 종료한 후 프로그램은 END를 출력합니다.
  1. 프로그램을 실행합니다.
go run break_with_goto.go
  1. 출력을 확인합니다.
0123456789END

이 예제는 goto가 루프에서 break 문을 대체하여 루프를 종료하는 다른 방법을 제공하는 방법을 보여줍니다.

goto 문을 사용하여 for 루프 구현하기

goto는 또한 루프를 수동으로 구현하는 데 사용할 수 있습니다. Go 는 기본 for 루프를 제공하지만, 이 연습은 goto가 루핑 동작을 어떻게 에뮬레이션할 수 있는지 보여줍니다.

예시: goto를 사용한 for 루프

  1. for_loop_with_goto.go라는 새 파일을 생성합니다.
cd ~/project
touch for_loop_with_goto.go
  1. 다음 코드를 작성합니다.
package main

import "fmt"

func main() {
    var i = 0            // Initialize a variable i
BEGIN:
    fmt.Printf("%d ", i) // Print the current value of i
    if i == 9 {          // Check if i has reached 9
        goto END         // Exit the loop if true
    }
    i++                  // Increment i
    goto BEGIN           // Jump back to the label "BEGIN"
END:
}
  • 프로그램은 i0으로 초기화하고 BEGIN 레이블을 사용하여 루프를 시작합니다.
  • i의 값을 출력하고 9에 도달했는지 확인합니다.
  • 그렇지 않은 경우 i를 증가시키고 BEGIN 레이블로 다시 점프하여 프로세스를 반복합니다.
  • i9와 같아지면 프로그램은 END 레이블로 점프하여 루프를 종료합니다.
  1. 프로그램을 실행합니다.
go run for_loop_with_goto.go
  1. 출력을 확인합니다.
0 1 2 3 4 5 6 7 8 9

이 예제는 goto가 루프 구조를 어떻게 모방할 수 있는지 보여줍니다.

goto 문을 사용하여 중첩 루프 탈출하기

break를 사용하여 중첩 루프를 종료하는 것은 일반적으로 추가적인 로직과 변수가 필요하므로 번거로울 수 있습니다. goto는 여러 루프에서 직접 점프할 수 있도록 하여 이 프로세스를 단순화합니다.

예시: goto를 사용하여 중첩 루프 종료하기

  1. nested_loop_with_goto.go라는 새 파일을 생성합니다.
cd ~/project
touch nested_loop_with_goto.go
  1. 다음 코드를 작성합니다.
package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {      // Outer loop
        for j := 0; j < 5; j++ {  // Inner loop
            if j == 3 {           // Exit condition
                goto END          // Jump to the "END" label
            }
            fmt.Println(i, j)     // Print the current values of i and j
        }
    }
END:
}
  • 프로그램은 중첩 루프로 시작합니다: i에 대한 외부 루프와 j에 대한 내부 루프입니다.
  • 내부 루프 내에서 j3과 같은지 확인합니다. 참이면 프로그램은 END 레이블로 점프하여 두 루프를 모두 종료합니다.
  • 결과적으로 프로그램은 j2와 같아질 때까지만 (i, j) 쌍을 출력합니다.
  1. 프로그램을 실행합니다.
go run nested_loop_with_goto.go
  1. 출력을 확인합니다.
0 0
0 1
0 2

이 접근 방식은 여러 break 문이나 플래그를 사용하는 것보다 훨씬 깔끔하며, 특히 깊이 중첩된 루프에서 유용합니다.

다음과 같이 break 문을 사용하여 이 프로그램을 구현하는 경우:

package main

import "fmt"

func main() {
    // Check variable
    var check = false
    // First loop
    for i := 0; i < 5; i++ {
        // Second loop
        for j := 0; j < 5; j++ {
            if j == 3 {
                // Exit the second loop
                check = true
                break
            }
            fmt.Println(i, j)
        }
        // Determine whether to exit the first loop
        if check == true {
            break
        }
    }
}

요약

이 랩에서는 Go 의 goto 문과 그 다양한 응용 분야를 살펴보았습니다. 다음은 우리가 배운 내용입니다.

  • goto 문은 동일한 함수 내의 지정된 레이블로 무조건적인 점프를 허용합니다.
  • break 문을 대체하고, 루프를 구현하며, 중첩 루프를 보다 효율적으로 종료하는 데 사용할 수 있습니다.
  • goto는 유연성과 간결성을 제공하지만, 코드 가독성을 저하시키지 않도록 신중하게 사용해야 합니다.

goto를 효과적으로 이해하고 사용함으로써 프로그램에서 특정 제어 흐름 시나리오를 단순화할 수 있습니다. 그러나 항상 코드의 명확성과 유지 관리성을 위해 노력하십시오!