>백엔드 개발 >Golang >Go에서 'defer' 문은 명명된 반환 값에 어떻게 영향을 미치나요?

Go에서 'defer' 문은 명명된 반환 값에 어떻게 영향을 미치나요?

Patricia Arquette
Patricia Arquette원래의
2024-12-02 05:38:131002검색

How Do `defer` Statements Affect Named Return Values in Go?

defer는 명명된 반환 값과 어떻게 상호 작용합니까?

Go에서 defer 키워드는 주변 함수가 반환될 때까지 함수 실행을 연기합니다. . 명명된 반환 값의 맥락에서 이 동작을 통해 지연된 함수는 최종적으로 반환될 값을 수정할 수 있습니다.

다음 예를 고려하세요.

func c() (i int) {
    defer func() { i++ }()
    return 1
}

이 예에서 기본 함수는 1을 반환합니다. 그러나 지연된 함수는 기본 함수가 반환되기 전에 명명된 반환 값 i를 1씩 증가시킵니다. 결과적으로 메인 함수의 실제 반환 값은 2입니다.

이러한 동작은 Go에서 인수가 있는 return 문이 반환하기 전에 명명된 반환 변수에 효과적으로 값을 할당하기 때문에 가능합니다. 따라서 return 1 문은 다음과 동일합니다.

i = 1
return

결과적으로 지연된 함수는 명명된 반환 값 i에 할당하고 주변 함수의 반환 값을 수정할 수 있습니다.

defer문의 순서가 중요하다는 점에 유의하는 것이 중요합니다. 지연된 함수는 LIFO(후입선출) 순서로 실행됩니다. 이는 주변 함수가 반환된 후 가장 최근에 지연된 함수가 먼저 실행된다는 의미입니다.

이 작동 방식을 더 잘 이해하려면 다음 수정된 예를 고려하세요.

func c() (i int) {
    defer func() { fmt.Println("third") }()
    defer func() { i = 2 }()
    defer func() { fmt.Println("first") }()

    fmt.Println("second")
    return 1
}

이 예에서는 실행 순서는 다음과 같습니다:

  1. fmt.Println("second")
  2. return 1
  3. i = 2
  4. fmt.Println("first")
  5. fmt.Println("third")

지연 함수 i를 2로 설정하는 것은 함수가 반환되기 전에 실행되므로 반환 값은 2입니다. fmt.Println 문은 역방향으로 실행됩니다. 지연의 LIFO 동작으로 인해 주문이 발생합니다.

위 내용은 Go에서 'defer' 문은 명명된 반환 값에 어떻게 영향을 미치나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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