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 중국어 웹사이트의 기타 관련 기사를 참조하세요!