> 백엔드 개발 > Golang > Go에서 `log.Fatalln()` 호출 후에 `defer` 함수가 실행됩니까?

Go에서 `log.Fatalln()` 호출 후에 `defer` 함수가 실행됩니까?

Barbara Streisand
풀어 주다: 2024-12-07 19:44:14
원래의
427명이 탐색했습니다.

Will `defer` functions execute after a `log.Fatalln()` call in Go?

지연 함수 및 log.Fatalln() 호출

문제:

다음 Go 코드를 고려하세요.

db, err := sql.Open("postgres", "…")
if err != nil {
    log.Fatalln(err)
}
defer db.Close()

tpl, err := template.ParseGlob("")
if err != nil {
    log.Fatalln(err)
}
로그인 후 복사

만약 template.ParseGlob("") 오류를 반환하면 db.Close() 함수가 호출됩니까?

답변:

아니요, 이 경우 지연된 함수는 실행되지 않습니다. 시나리오.

설명:

log.Fatalln()은 오류 메시지를 인쇄한 다음 os.Exit(1)을 호출하여 프로그램을 즉시 종료하는 로깅 함수입니다. . 자세한 내용은 다음과 같습니다.

  • log.Fatalln()은 log.Print() 뒤에 os.Exit(1)이 오는 것과 동일합니다.
  • os.Exit()는 프로그램이 다음을 수행하도록 합니다. 지정된 상태 코드로 종료합니다(이 경우 실패는 1).
  • 지연 함수(예: db.Close())는 os.Exit()가 호출될 때 실행되지 않습니다.

코드 조각에서 template.ParseGlob("") 호출이 실패하고 log.Fatalln()이 트리거되면 프로그램이 종료됩니다. 즉시. 결과적으로, 지연된 함수 db.Close()가 실행되지 않고 잠재적으로 데이터베이스 연결이 열린 상태로 남게 됩니다.

데모:

이 동작을 설명하기 위해 다음 코드를 실행할 수 있습니다:

package main

import (
    "log"
    "os"
)

func main() {
    defer os.Exit(1) // Exit the program with status code 1
    log.Fatalln("Program terminated early")
}
로그인 후 복사

이 코드를 실행하면 오류 메시지가 기록되고 프로그램이 종료됩니다. 지연된 함수가 실행되지 않고 즉시 실행됩니다.

예방:

부적절하게 닫힌 리소스 또는 처리되지 않은 작업과 관련된 문제를 방지하려면 오류 로깅에 log.Println() 사용을 고려하세요. 프로그램을 종료하지 않고 오류를 정상적으로 처리합니다.

위 내용은 Go에서 `log.Fatalln()` 호출 후에 `defer` 함수가 실행됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿