>  기사  >  백엔드 개발  >  Go 언어에서 goto를 사용하는 방법

Go 언어에서 goto를 사용하는 방법

青灯夜游
青灯夜游원래의
2022-11-23 18:40:495882검색

go 언어에서 goto 문은 무조건 점프에 사용됩니다. 이는 프로그램의 지정된 줄로 무조건 이동할 수 있으며 레이블을 통해 코드 간에 무조건 점프를 수행합니다. goto 뒤에는 레이블이 옵니다. 이 레이블의 의미는 Go 프로그램에 다음에 실행할 코드 행을 알려주는 것입니다. 구문은 "goto label;... ...label: 표현식;"입니다. goto는 원래 코드 실행 순서를 깨고 지정된 줄로 직접 점프하여 코드를 실행합니다. goto 문은 일반적으로 조건문과 함께 사용되며 조건부 전송을 구현하고 루프를 형성하고 루프 본문에서 점프하는 데 사용할 수 있습니다.

Go 언어에서 goto를 사용하는 방법

이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.

go 언어의 goto 문

goto Gu Yansi 의미는 점프를 의미합니다.

Go 언어의 goto 문은 무조건 프로그램의 지정된 줄로 이동할 수 있고 레이블을 통해 무조건 코드 사이를 이동할 수 있습니다. 동시에 goto 문은 루프에서 빠르게 벗어나고 반복 종료를 피하는 데도 도움이 됩니다. 문은 일부 코드의 구현 프로세스를 단순화할 수 있습니다.

goto 문의 구문

goto 뒤에는 레이블이 옵니다. 이 레이블의 의미는 Go 프로그램에 다음에 실행할 코드 줄을 알려주는 것입니다.

그러므로 이 라벨을 어디에 어떻게 배치할지가 goto에서 가장 주의해야 할 사항입니다.

goto 标签;
...
...
标签: 表达式;

goto 문 흐름도는 다음과 같습니다.

Go 언어에서 goto를 사용하는 방법

goto 문 사용

  • goto는 원래 코드 실행 순서를 깨고 특정 코드 실행 줄로 직접 이동할 수 있습니다.

import "fmt"

func main() {

    goto flag
    fmt.Println("B")
flag:
    fmt.Println("A")

}

실행 결과는 B가 출력되지 않고 A

A
  • goto 문은 일반적으로 조건문과 함께 사용됩니다. 조건부 전송을 구현하고, 루프를 형성하고, 루프 본문에서 점프하고 기타 기능을 수행하는 데 사용할 수 있습니다.

다음은 goto를 사용하여 1부터 5까지 인쇄하는 루프를 구현하는 예입니다.

import "fmt"

func main() {
    i := 1
flag:
    if i <= 5 {
        fmt.Println(i)
        i++
        goto flag
    }
}

출력은 다음과 같습니다

Go 언어에서 goto를 사용하는 방법

또 다른 예에서는 goto를 사용하여 break 유형의 효과를 얻습니다.

import "fmt"

func main() {
    i := 1
    for {
        if i > 5 {
            goto flag
        }
        fmt.Println(i)
        i++
    }
flag:
}

출력은 다음과 같습니다

Go 언어에서 goto를 사용하는 방법

마지막으로 goto를 사용하여 continue 유형의 효과를 얻고 1부터 10까지의 모든 짝수를 인쇄합니다.

import "fmt"

func main() {
    i := 1
flag:
    for i <= 10 {
        if i%2 == 1 {
            i++
            goto flag
        }
        fmt.Println(i)
        i++
    }
}

출력은 다음과 같습니다

Go 언어에서 goto를 사용하는 방법

다단계 루프를 종료하려면 goto를 사용하세요

다음 코드는 조건이 충족되면 2단계 루프를 계속해서 종료해야 합니다. 전통적인 코딩 방법은 다음과 같습니다. 다음:

package main
import "fmt"
func main() {
    var breakAgain bool
    // 外循环
    for x := 0; x < 10; x++ {
        // 内循环
        for y := 0; y < 10; y++ {
            // 满足某个条件时, 退出循环
            if y == 2 {
                // 设置退出标记
                breakAgain = true
                // 退出本次循环
                break
            }
        }
        // 根据标记, 还需要退出一次循环
        if breakAgain {
                break
        }
    }
    fmt.Println("done")
}

코드 설명 다음과 같습니다:

  • 라인 10, 외부 루프를 만듭니다.

  • 13번째 줄, 내부 루프를 구성합니다.

  • 라인 16에서 y==2이면 모든 for 루프를 종료해야 합니다.

  • 라인 19. 기본적으로 루프는 레이어별로만 종료할 수 있습니다. 이렇게 하려면 상태 변수 breakAgain을 설정해야 합니다. 종료해야 할 경우 이 변수를 true로 설정합니다.

  • 라인 22에서 break를 사용하여 현재 루프를 종료합니다. 실행 후 코드는 라인 28로 전송됩니다.

  • 라인 28에서는 루프의 한 레이어를 종료한 후 breakAgain 변수를 사용하여 루프의 외부 레이어를 다시 종료해야 하는지 여부를 결정합니다.

  • 라인 34, 모든 루프를 종료한 후 인쇄가 완료됩니다.

Go 언어의 goto 문을 사용하여 위 코드를 최적화합니다.

package main
import "fmt"
func main() {
    for x := 0; x < 10; x++ {
        for y := 0; y < 10; y++ {
            if y == 2 {
                // 跳转到标签
                goto breakHere
            }
        }
    }
    // 手动返回, 避免执行进入标签
    return
    // 标签
breakHere:
    fmt.Println("done")
}

코드 설명은 다음과 같습니다.

  • 라인 13에서 goto 문을 사용하여 라인에 정의된 지정된 레이블로 이동합니다. 23.

  • 라인 20은 goto에서만 사용할 수 있지만, 여기서 수동으로 반환하지 않으면 조건이 충족되지 않을 때 코드의 24번째 라인도 실행됩니다.

  • 라인 23, breakHere 태그를 정의합니다.

goto 문을 사용한 후 추가 변수 없이 모든 루프를 빠르게 종료할 수 있습니다.

goto를 사용하여 오류를 중앙에서 처리

여러 오류 처리에 코드 중복이 있는 경우 매우 까다롭습니다. 예:

err := firstCheckError()
if err != nil {
    fmt.Println(err)
    exitProcess()
    return
}
err = secondCheckError()
if err != nil {
    fmt.Println(err)
    exitProcess()
    return
}
fmt.Println("done")

코드 설명은 다음과 같습니다.

  • 라인 1, 실행 특정 논리를 실행하고 오류를 반환합니다.

  • 라인 2~6, 오류가 발생하면 오류를 인쇄하고 프로세스를 종료합니다.

  • 라인 8, 특정 로직을 실행하고 오류를 반환합니다.

  • 10~14행, 오류 발생 후 프로세스를 종료합니다.

  • 16행, 오류 없음, 인쇄 완료.

위 코드의 일부는 반복되는 오류 처리 코드입니다. 나중에 이러한 코드에 더 많은 판단이 추가되면 이러한 유사한 코드를 순차적으로 수정해야 하므로 쉽게 간과 및 오류가 발생할 수 있습니다.

使用 goto 语句来实现同样的逻辑:

    err := firstCheckError()
    if err != nil {
        goto onExit
    }
    err = secondCheckError()
    if err != nil {
        goto onExit
    }
    fmt.Println("done")
    return
onExit:
    fmt.Println(err)
    exitProcess()

代码说明如下:

  • 第 3 行和第 9 行,发生错误时,跳转错误标签 onExit。

  • 第 17 行和第 18 行,汇总所有流程进行错误打印并退出进程。

注意事项

goto语句与标签之间不能有变量声明,否则编译错误。

import "fmt"

func main() {
    fmt.Println("start")
    goto flag
    var say = "hello oldboy"
    fmt.Println(say)
flag:
    fmt.Println("end")
}

编译错误

.\main.go:7:7: goto flag jumps over declaration of say at .\main.go:8:6

【相关推荐:Go视频教程

위 내용은 Go 언어에서 goto를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.