>백엔드 개발 >Golang >Go의 'defer' 문은 입력 매개변수와 명명된 결과 매개변수로 선언된 변수에 어떻게 영향을 미치나요?

Go의 'defer' 문은 입력 매개변수와 명명된 결과 매개변수로 선언된 변수에 어떻게 영향을 미치나요?

Susan Sarandon
Susan Sarandon원래의
2024-11-25 20:11:12254검색

How Do Go's `defer` Statements Affect Variables Declared as Input Parameters vs. Named Result Parameters?

Golang에서 다르게 선언된 변수에 대한 동작 지연

이름이 지정된 결과 매개변수가 있는 함수는 입력 매개변수가 있는 함수와 비교하여 defer 문을 사용할 때 다르게 동작합니다. . 이 예에서는 다음 차이점을 조사합니다.

package main

import (
    "fmt"
)

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

func c1() (i int) {
    defer func() { i++ }()
    return i
}

func c2() (i int) {
    defer func() { i++ }()
    return 2
}

func main() {
    fmt.Println(c(0)) // Prints 0
    fmt.Println(c1()) // Prints 1
    fmt.Println(c2()) // Prints 3
}

c(i int):

이 경우 i는 수신 매개변수입니다. 반환 값은 지연된 함수가 실행되기 전에 평가되므로 반환 후 i를 증가시키는 것은 효과가 없습니다.

c1():

여기서 i는 결과 매개 변수입니다. . return i 문은 i 값을 반환 값에 할당합니다. 그러나 지연된 함수는 반환 변수를 수정할 수 있습니다. 이 경우 지연된 함수는 i를 증가시켜 결과적으로 1의 반환 값을 생성합니다.

c2():

c1()과 유사하게 return 2 문 i에 2를 할당합니다. 그러나 이 경우 지연된 함수는 return 문 다음에 실행되어 반환 값이 3이 됩니다.

요약하자면, Go에서 이름이 지정된 결과 매개변수로 작업할 때 지연된 함수가 수정될 수 있다는 점을 기억하는 것이 중요합니다. return 문 이후에도 해당 값은 유지됩니다. 이 동작은 Go 사양에 명시적으로 언급되어 있으며 필요한 경우 반환 값을 변경하는 데 사용될 수 있습니다.

위 내용은 Go의 'defer' 문은 입력 매개변수와 명명된 결과 매개변수로 선언된 변수에 어떻게 영향을 미치나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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