문제:
다음 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)을 호출하여 프로그램을 즉시 종료하는 로깅 함수입니다. . 자세한 내용은 다음과 같습니다.
코드 조각에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!