>  기사  >  백엔드 개발  >  Go에서 지연된 함수 실행 시간을 측정하면 예기치 않은 결과가 반환되는 이유는 무엇입니까?

Go에서 지연된 함수 실행 시간을 측정하면 예기치 않은 결과가 반환되는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-20 11:47:51815검색

Why Does Measuring Deferred Function Execution Time in Go Return Unexpected Results?

Go에서 지연 함수를 사용하여 함수 실행 시간 측정

Go에서 지연 함수는 함수 실행을 지연하는 편리한 메커니즘을 제공합니다. 주변 함수가 반환됩니다. 그러나 지연된 함수를 실행하는 데 걸린 시간을 인쇄하면 예기치 않은 결과가 반환되는 경우가 있습니다.

문제:

실행 시간을 계산하려고 시도하는 다음 sum() 함수를 고려하세요. 지연 함수 사용:

func sum() {
    start := time.Now()

    //Expecting to print non-zero value but always gets 0
    defer fmt.Println(time.Now().Sub(start))

    sum := 0
    for i := 1; i < 101; i++ {
        sum += i
    }
    time.Sleep(1 * time.Second)
    fmt.Println(sum)
}

이 코드를 실행하면 실행 시간이 0으로 인쇄됩니다.

해결책:

문제가 발생하는 이유는 다음과 같습니다. 지연된 함수에 대한 인수는 함수가 실행될 때가 아니라 함수가 지연될 때 평가됩니다. 이 문제를 해결하려면 익명 함수를 사용하여 start의 현재 값을 캡처하고 해당 익명 함수의 실행을 연기합니다.

defer func() { fmt.Println(time.Now().Sub(start)) }()

익명 함수를 사용하면 start 값이 지연된 시점에 평가됩니다. 함수가 실행됩니다.

추가 고려 사항:

더 많은 사용자 정의 또는 유연성이 필요한 경우 재사용 가능한 함수에 타이밍 논리를 캡슐화하는 것이 좋습니다. 이 접근 방식은 더욱 모듈화되고 재사용 가능한 솔루션을 제공합니다.

위 내용은 Go에서 지연된 함수 실행 시간을 측정하면 예기치 않은 결과가 반환되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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