>백엔드 개발 >Golang >Golang 함수 defer 문 사용 분석

Golang 함수 defer 문 사용 분석

WBOY
WBOY원래의
2023-05-16 11:21:271064검색

Golang은 동시성을 지원하고 기계어 코드로 컴파일되는 객체 지향 프로그래밍 언어로, 간단한 구문, 효율적인 성능 및 풍부한 표준 라이브러리를 갖추고 있습니다. Golang에서는 defer 문을 사용하여 함수 실행을 지연시킵니다. 이 언어 기능은 코드를 작성할 때 매우 유용합니다. 이번 글에서는 Golang 함수의 defer 문의 사용법과 분석에 대해 설명하겠습니다.

1. defer 문의 기본 구문

Golang에서는 defer 문을 사용하여 함수가 반환될 때까지 함수나 메서드의 실행을 연기할 수 있습니다. defer 문의 구문은 매우 간단합니다. 구문 형식은 다음과 같습니다.

defer 函数名(参数列表)

여기서 defer는 Golang 언어의 키워드입니다. defer 문은 어디에서나 사용할 수 있지만 함수나 메서드의 시작 부분에 선언하는 것이 함수나 메서드의 실행 과정을 더 명확하게 표시할 수 있는 것이 가장 좋습니다.

2. defer 문 실행 원리

함수 실행 시 함수 내부에 defer 문이 있으면 이 defer 문은 정의 순서에 따라 역순으로 실행됩니다. 즉, defer 문이 정의되었습니다. last가 먼저 실행되고, 마지막 defer 문이 먼저 실행됩니다. 먼저 정의된 defer 문이 마지막에 실행됩니다. defer 문에는 후입선출 논리가 있습니다.

예를 들어 다음 코드는 간단한 defer 문 예를 구현합니다.

package main

import (
    "fmt"
)

func main() {
    defer fmt.Println("defer 1")
    defer fmt.Println("defer 2")
    defer fmt.Println("defer 3")

    fmt.Println("Hello, Golang!")
}

출력 결과는 다음과 같습니다.

Hello, Golang!
defer 3
defer 2
defer 1

fmt.Println("Hello, Golang!")이 먼저 실행된 다음 다음을 기반으로 하는 것을 볼 수 있습니다. 후입 선출 논리에서는 세 개의 defer 문이 실행됩니다.

3. defer 문의 응용 시나리오

defer 문은 Golang 언어에서 매우 일반적으로 사용되며 다음과 같은 시나리오에서 사용할 수 있습니다.

  1. 파일 닫기

Golang을 사용하여 파일을 조작할 때 파일 열기 작업이 완료되면 즉시 파일을 닫아야 합니다. Close() 함수를 직접 사용하는 경우 프로그램 작업 중 예상치 못한 상황이 발생하면 파일을 닫지 못할 수 있습니다. 이때 defer 문을 사용할 수 있습니다. 파일이 정상인지 확인하기 위해 함수가 끝날 때까지 Close() 함수 실행을 지연합니다. Close, 관련 코드 예는 다음과 같습니다.

file, err := os.Open("test.txt")
if err != nil {
    fmt.Println(err)
}
defer file.Close()
  1. Unlock 작업

Golang에서 sync.Mutex를 사용하세요. 뮤텍스를 제어하고 함수 끝에서 잠금을 해제합니다. 이 경우 프로그램의 교착 상태를 방지하기 위해 다음은 샘플 코드입니다.

var mutex sync.Mutex

func sample() {
    mutex.Lock()
    defer mutex.Unlock()

    // 操作代码
}
  1. 함수 실행 시간 계산

When Golang 함수의 성능을 테스트하면 함수 실행 전후의 시간을 기록하고 시간 차이를 계산하여 함수의 실행 시간을 얻을 수 있습니다. 시간이 함수 내에서 직접 계산되는 경우 많은 코드 논리로 인해 타임스탬프가 다른 위치에서 얻어질 수 있으므로 디버깅이 복잡해집니다. 이때 defer 문을 이용하면 함수 종료 시의 시간차를 계산하여 함수 실행 시간을 구할 수 있다.

import (
    "time"
)

func calcExecTime() {
    startTime := time.Now().UnixNano()
    defer func() {
        fmt.Println("time", float32(time.Now().UnixNano()-startTime)/1000000.0)
    }()

    // 操作代码
}

4. defer 문 주의 사항

defer 문을 사용할 때 다음 사항에 주의해야 합니다.

  1. defer 문 실행은 현재 함수나 메서드가 종료되기 전에 실행되므로 함수 또는 메서드의 코드 수정 함수 또는 메서드의 내부 상태가 수정되고 이러한 수정 사항은 defer가 실행될 때 계속 적용됩니다.
  2. defer 문은 일반적으로 파일을 닫거나 메모리를 해제하는 등 일부 리소스를 정리하는 데 사용되므로 적절한 시기에 defer 문을 사용해야 합니다.
  3. defer 문을 사용할 때는 프로그램 성능에 영향을 줄 수 있는 대규모 루프나 데이터베이스 연결과 같이 비용이 많이 드는 코드가 포함된 함수를 사용하지 않아야 합니다.

5. 요약

Golang에서는 defer 문을 사용하여 함수가 반환될 때까지 함수나 메서드의 실행을 연기할 수 있습니다. defer 문은 Golang 언어에서 매우 일반적으로 사용되며 파일 닫기, 작업 잠금 해제 및 함수 실행 시간 계산에 사용할 수 있습니다. defer 문을 사용할 때는 프로그램 성능에 영향을 미치지 않도록 값비싼 코드가 포함된 함수를 사용하지 않아야 합니다. .

위 내용은 Golang 함수 defer 문 사용 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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