> 백엔드 개발 > Golang > 지역 변수 변경을 처리할 때 Go에서 Defer를 올바르게 사용하는 방법은 무엇입니까?

지역 변수 변경을 처리할 때 Go에서 Defer를 올바르게 사용하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-10 13:55:14
원래의
184명이 탐색했습니다.

How to Correctly Use Defer in Go When Dealing with Changing Local Variables?

Defer 사용법 설명: 최종 변수 값 인쇄

Go에서 defer 키워드를 사용하면 함수가 실행되기 직전에 실행되도록 예약할 수 있습니다. 주변 함수가 반환됩니다. 그러나 지연된 함수가 주변 함수 내에서 변경될 수 있는 지역 변수를 사용하는 경우 올바른 값이 사용되도록 특별한 주의를 기울여야 합니다.

다음 함수를 고려하세요.

func printNumbers() {
    var x int

    defer fmt.Println(x)

    for i := 0; i < 5; i++ {
        x++
    }
}
로그인 후 복사

언어 사양에 따라 defer 문이 실행되면 지역 변수가 평가되어 새로 저장됩니다. 그러나 실제 함수는 나중까지 호출되지 않습니다. 이 경우 defer 문이 실행되면 x 값이 0이므로 deferred 함수가 호출되면 0이 인쇄됩니다.

이 문제를 해결하려면 다음 방법 중 하나를 사용할 수 있습니다.

1. 익명 함수 사용:

defer func() { fmt.Println(x) }()
로그인 후 복사

이것은 x의 현재 값을 캡처하는 익명 함수를 사용합니다. 익명 함수가 호출되면 주변 함수에서 x가 변경되더라도 캡처된 값을 사용합니다.

2. 포인터 사용:

var x int
defer Print(&x)
로그인 후 복사

x에 대한 포인터를 사용하고 지정된 값을 인쇄하는 함수를 연기할 수 있습니다. 이는 defer 문이 실행될 때 포인터 값이 평가되지만 deferred 함수가 호출될 때까지는 포인터 값이 평가되지 않기 때문에 작동합니다.

3. 사용자 정의 유형:

type MyInt int
func (m *MyInt) String() string { return strconv.Itoa(int(*m)) }
var x MyInt
defer fmt.Println(&x)
로그인 후 복사

여기서 fmt.Stringer 인터페이스를 구현하는 사용자 정의 유형 MyInt를 생성하여 값이 인쇄되는 방법을 지정할 수 있습니다. &x가 인쇄되면 String 메소드가 호출되어 지정된 값의 문자열 표현을 반환합니다.

4. 래핑:

x := []int{0}
defer fmt.Println(x)
로그인 후 복사

슬라이스의 변수를 래핑하면 슬라이스 내용을 인쇄하는 함수를 연기할 수 있습니다. defer 문이 실행될 때 슬라이스 설명자가 평가되지만, deferred 함수가 호출될 때까지 기본 배열은 평가되지 않습니다.

deferred 함수에 사용되는 변수는 다음의 매개 변수가 되어서는 안 된다는 점을 기억하는 것이 중요합니다. defer 문이 실행될 때 매개 변수가 평가되므로 지연된 함수 자체입니다.

위 내용은 지역 변수 변경을 처리할 때 Go에서 Defer를 올바르게 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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