[go] os.Exit () 및 panic ()을 언제 사용합니까?

누군가의 주요 차이점 os.Exit()panic()Go에서 실제로 사용되는 방법을 설명 할 수 있습니까?



답변

우선, “실제로 사용되는 방법”에 대한 질문이있을 때마다 Go 소스 코드 (또는 실제로는 충분히 큰 Go 코드베이스) 및 패키지 문서검색 하는 것이 좋습니다. 답변을.

지금 os.Exitpanic상당히 다르다. panic프로그램 또는 그 부분이 복구 불가능한 상태에 도달했을 때 사용됩니다.

panic와 같은 범위를 벗어 조각을 색인 또는 형의 주장을 실패로 런타임 오류를 암시 적으로 포함라고, 즉시 현재 함수의 실행을 중지하고 길을 따라 어떤 연기 기능을 실행되는 goroutine의 스택을 풀기 시작한다. 해제가 고 루틴 스택의 맨 위에 도달하면 프로그램이 종료됩니다.

os.Exit복구 가능성이 없거나 지연된 정리 명령문을 실행하지 않고 프로그램을 즉시 중단하고 오류 코드 (다른 프로그램이 발생한 상황을보고하는 데 사용할 수 있음)를 반환해야 할 때 사용됩니다. 이것은 테스트에서 유용합니다.이 테스트가 실패한 후 다른 테스트도 실패한다는 것을 이미 알고있는 경우, 지금 종료하는 것이 좋습니다. 프로그램이 필요한 모든 작업을 수행하고 이제 종료해야 할 때 (예 : 도움말 메시지를 인쇄 한 후) 사용할 수도 있습니다.

대부분의 경우 사용하지 않으며 panic( error대신을 반환해야 함 ) os.Exit테스트 및 빠른 프로그램 종료를 위해 일부 경우를 제외하고는 거의 필요하지 않습니다 .


답변

우선 os.Exit(), 오류없이 정상적으로 프로그램을 종료하는 데 사용할 수 있으며 당황하지 않을 수 있습니다. 이것이 하나의 중요한 차이점입니다. 다른 하나는 어딘가에서 패닉이 포착되고 무시되거나를 사용하여 기록 될 수 있다는 것 recover입니다.

그러나 잘못된 종료 코드에 대해 이야기하고 있다면 다음과 같이 가정 해 보겠습니다.

panic뭔가 끔찍하게 잘못되었을 때 사용합니다 . 아마도 프로덕션으로 가기 전에 잡았어야 할 프로그래머 오류 일 것입니다. 이것이 스택을 인쇄하는 이유입니다.

os.Exit(errorCode)원하는 경우 또는 이와 유사한 것을 사용하십시오 .

  1. 스크립팅 목적으로 프로그램의 종료 코드를 제어합니다.

  2. 예상되는 오류 (예 : 사용자 입력 오류)에 대해 순서대로 종료하기를 원합니다.

그래서 기본적으로 패닉은 당신을위한 것이고, 나쁜 종료 코드는 당신의 사용자를위한 것입니다.


답변

주요 차이점은 다음과 같습니다.

  1. os.Exit 지연된 함수의 실행을 건너 뜁니다.
  2. 를 사용 os.Exit하면 종료 코드를 지정할 수 있습니다.
  3. panic종료되는 동안 종료 os.Exit되지 않습니다. (다른 답변은 이것을 언급하지 않는 것 같습니다.)

지연된 함수를 실행해야하는 경우 선택의 여지가 없지만 panic. (반면, 지연된 함수 실행을 건너 뛰려면을 사용하십시오 os.Exit.)

void가 아닌 함수가 다음과 같이 정의 된 경우 :

  1. 함수에는 많은 분기가 포함되어 있습니다.
  2. 모든 분기는 return또는 로 종료됩니다.panic

그럼 당신은 대체 할 수 없습니다 panicos.Exit“기능의 끝에 반환 누락”라고, 그렇지 않으면 컴파일러는 프로그램을 컴파일을 거부합니다. (Go는 여기에서 매우 멍청 log.Panic하고 기능을 종료하지도 않습니다.)

다른 조건에서 :

  1. panic프로그래밍 논리 오류와 같이 실제로 유선이 발생할 때 사용 합니다.
  2. os.Exit지정된 종료 코드로 즉시 종료를 원할 때 사용하십시오 .


답변