go 언어에서 goto 문은 무조건 점프에 사용됩니다. 이는 프로그램의 지정된 줄로 무조건 이동할 수 있으며 레이블을 통해 코드 간에 무조건 점프를 수행합니다. goto 뒤에는 레이블이 옵니다. 이 레이블의 의미는 Go 프로그램에 다음에 실행할 코드 행을 알려주는 것입니다. 구문은 "goto label;... ...label: 표현식;"입니다. goto는 원래 코드 실행 순서를 깨고 지정된 줄로 직접 점프하여 코드를 실행합니다. goto 문은 일반적으로 조건문과 함께 사용되며 조건부 전송을 구현하고 루프를 형성하고 루프 본문에서 점프하는 데 사용할 수 있습니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.
go 언어의 goto 문
goto Gu Yansi 의미는 점프를 의미합니다.
Go 언어의 goto 문은 무조건 프로그램의 지정된 줄로 이동할 수 있고 레이블을 통해 무조건 코드 사이를 이동할 수 있습니다. 동시에 goto 문은 루프에서 빠르게 벗어나고 반복 종료를 피하는 데도 도움이 됩니다. 문은 일부 코드의 구현 프로세스를 단순화할 수 있습니다.
goto 문의 구문
goto 뒤에는 레이블이 옵니다. 이 레이블의 의미는 Go 프로그램에 다음에 실행할 코드 줄을 알려주는 것입니다.
그러므로 이 라벨을 어디에 어떻게 배치할지가 goto에서 가장 주의해야 할 사항입니다.
goto 标签; ... ... 标签: 表达式;
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 } }
출력은 다음과 같습니다
또 다른 예에서는 goto를 사용하여 break 유형의 효과를 얻습니다.
import "fmt" func main() { i := 1 for { if i > 5 { goto flag } fmt.Println(i) i++ } flag: }
출력은 다음과 같습니다
마지막으로 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++ } }
출력은 다음과 같습니다
다단계 루프를 종료하려면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!