Go에서는 함수 시그니처에서 반환 값의 이름을 명시적으로 선언할 수 있습니다. 이러한 값은 자동으로 해당 유형의 제로 값으로 초기화됩니다. 많은 반환 변수를 다룰 때 유용하며, 매개변수 없이 return 연산자를 통해 암시적으로 값을 "반환"할 수 있습니다.
예:
func foo() (x int, err error) { if someCheck() { x = 1 return // (1, nil)이 반환됩니다. } return // x와 err가 명시적으로 할당되지 않은 경우 (0, nil)이 반환됩니다. }
세부사항:
nil). 이는 논리 오류를 숨길 수 있습니다.명명된 결과가 있는 함수 내부에서 반환 변수에 대한 할당이 하나도 없고 단순히 return을 호출하면 어떤 값이 반환됩니까?
답변: 그들의 제로 값이 반환됩니다. 예를 들어, int의 경우 — 0, 포인터의 경우 — nil입니다.
예:
func test() (res *MyType, code int) { return // "return nil, 0"와 동일합니다. }
이야기
금융 서비스에서 명명된 반환이 있는 함수 내에서 오류 변수 err에 값을 할당하는 것을 잊었습니다. 이로 인해 실패 시 함수는 nil을 반환하고 오류가 사라졌습니다. 결과적으로 거래 처리에 문제가 생기고 일부 작업이 간과되었습니다.
이야기
함수를 리팩토링할 때 새로운 명명된 반환 결과를 추가했지만 이전 반환 유형과의 호환성을 간과했습니다 — 테스트는 제로 값 반환으로 인해 문제를 놓쳤고, 이는 저장소에서 조용한 버그로 이어졌습니다.
이야기
보조 함수 중 하나에서 명명된 결과를 통해 오류를 로깅했지만, 반환 시뿐만 아니라 로깅에서도 처리를 잊어버려 재현하기 어려운 버그(“error lost”)가 발생했습니다.