"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > '지연'이 GO의 입력 매개 변수와 다르게 이름을 지정하는 이유는 무엇입니까?

'지연'이 GO의 입력 매개 변수와 다르게 이름을 지정하는 이유는 무엇입니까?

2025-03-04에 게시되었습니다
검색:385

Why Does `defer` Affect Named Return Values Differently Than Input Parameters in Go?

사라지는 증분

다음 코드 스 니펫을 고려하십시오. FUNC () {i} () 반환 i } func main () { fmt.println (c (0)) // 인쇄 0 }

이 예에서는 C 함수를 호출하고 값 0을 전달합니다. 그러나 결과를 인쇄 할 때 예상 1이 아닌 0을 얻습니다. 이것은 함수의 입력 매개 변수로 선언되기 때문입니다. 반환 명령문이 실행되면 연기 함수가 호출되지만 증분은 리턴 값에 영향을 미치지 않습니다.

이전 예제와는 달리 다음 코드를 고려해 봅시다. FUNC () {i} () 반환 i } func main () { fmt.println (c1 ()) // 인쇄 1 }

여기서는 C1 함수의 결과 매개 변수로 선언됩니다. 반환 명령문이 실행되면 i의 값이 리턴 값으로 설정됩니다. 그러나 연기 함수는 여전히 반환되기 전에 i의 값을 수정할 수 있습니다. 이로 인해 출력이 1이됩니다.
func c(i int) int {
    defer func() { i   }()
    return i
}

func main() {
    fmt.Println(c(0)) // Prints 0
}
명시 적 반품 및 지연된 수정

이 동작을 추가로 설명하기 위해 다른 예를 추가하겠습니다.

func c2 () {int) { FUNC () {i} () 반환 2 } func main () { fmt.println (c2 ()) // 인쇄 3 }

이 예에서는 리턴 명령문이 연기 함수가 호출되기 전에 명시 적으로 i를 2로 설정합니다. 결과적으로, 연기 함수는 i의 값을 증가시키고 반환 값은 3이됩니다.
func c(i int) int {
    defer func() { i   }()
    return i
}

func main() {
    fmt.Println(c(0)) // Prints 0
}
명명 된 결과 매개 변수

이 예제의 주요 테이크 아웃의 힘은 입력 매개 변수와 명명 된 결과 매개 변수 간의 구별입니다. 입력 매개 변수는 함수로 전달되는 반면, 이름이 지정된 결과 매개 변수는 함수의 리턴 값을 보유하는 변수입니다. DEFER 기능은 반환 문이 실행 된 후 명명 된 결과 매개 변수를 수정할 수 있지만 입력 매개 변수에 영향을 줄 수는 없습니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3