프로그래밍Go 개발자

Go에서 blank identifier란 무엇이며, 올바르게 사용하는 곳은 어디인가요? 사용 시 '함정'이 있나요?

Hintsage AI 어시스턴트로 면접 통과

답변

Blank identifier(_)는 Go에서 값을 무시하는 데 사용되는 특수 식별자입니다. 함수가 반환하는 값을 사용할 필요가 없을 때, 패키지를 import할 때 init을 호출하기 위해서만 또는 인터페이스를 구현할 때 사용됩니다.

예시:

// 오류 반환 값을 무시합니다. data, _ := ioutil.ReadFile("file.txt") // 부수 효과만을 위해 패키지를 import합니다. import _ "net/http/pprof"

또한, blank identifier는 인터페이스를 구현할 때 모든 메소드를 명시적으로 사용하지 않아도 돕습니다:

var _ io.Reader = (*MyReader)(nil) // 타입이 인터페이스를 구현하지 않으면 컴파일 오류 발생

문제의 질문

blank identifier를 사용해 오류를 항상 무시할 수 있나요? 이것이 안전한 관행인가요?

답변: 아니요. blank identifier는 오류를 무시할 수 있지만, 이것은 안전한 관행이 아닙니다 — 오류를 무시하는 것은 종종 치명적인 버그나 프로그램의 비정상적인 작동으로 이어질 수 있습니다. 항상 오류를 의식적으로 처리해야 하며 (예: 논리에서 명확히 중요하지 않은 경우), 그런 경우에만 blank identifier를 사용하여 오류를 무시해야 합니다.

주제의 미세한 차이를 모른 채로 발생한 실제 오류 예시


이야기

파일 작업 애플리케이션에서 개발자는 _, _ = file.Write(...)를 사용하여 기록 오류를 무시했습니다. 그 결과 디스크가 가득 차거나 기록 오류가 발생할 때 프로그램은 '모든 것이 잘 진행되는 것처럼' 계속 작동하여 데이터 손실이 발생했습니다.


이야기

한 감사 프로젝트에서 감사자는 함수가 오류를 반환하는 경우 항상 무시해야 한다고 믿었습니다 (_). 이로 인해 테스트하는 동안 동작 로그 기록 중 오류가 발견되지 않았고, 중요한 데이터가 손실되었으며 그 원인이 파악되지 않았습니다.


이야기

Go를 공부하던 학생은 여러 서드파티 패키지를 import할 때 blank identifier를 사용했지만, 사실 필요하지 않았습니다. 그 결과 바이너리 파일의 크기가 거의 두 배로 증가했으며, 모든 패키지의 부수 효과가 최종 애플리케이션에 포함되었습니다.