프로그래밍Go 백엔드 개발자

Go에서 변수 초기화는 어떻게 이루어지며, zero values(유효하지 않은 값)를 사용하는 것이 위험한 이유는 무엇인가요?

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

답변

Go에서는 명시적인 초기값 없이 선언된 변수는 자동으로 유효하지 않은 값 (zero values)을 가지며, 이는 다양한 유형에 따라 다릅니다:

  • int — 0
  • bool — false
  • string — ""
  • 포인터, 인터페이스, 슬라이스, 맵, 채널, 함수 — nil

이것은 편리하지만 (메모리에 쓰레기가 없기 때문에) 위험할 수 있습니다: 예를 들어 슬라이스와 맵과 같은 일부 유형은 nil 값을 가지고 작업할 때 패닉이 발생하거나 버그가 생길 수 있습니다.

예시:

var m map[string]int m["key"] = 1 // panic: nil 맵에서 항목에 할당하려고 함 var s []int fmt.Println(s, s == nil) // [] true (항목 추가 가능, 그러나 인덱스로 접근할 수 없음)

함정 질문

nil 값의 슬라이스와 nil 값의 맵/채널은 어떻게 다르며, 어떤 버그로 이어질 수 있나요?

정답: nil 값의 슬라이스는 함수에 전달하고 append 및 range에서 사용할 수 있으며 안전하지만, nil 맵과 작업하려고 하면 기록 시 패닉이 발생합니다 (하지만 읽기는 허용되며 zero value를 반환합니다).

예시:

var m map[string]int fmt.Println(m["no_key"]) // 0 — 안전함 m["key"] = 1 // panic! var s []int s = append(s, 42) // 괜찮음

이 주제에 대한 무지로 인한 실제 오류 사례


이야기

설명: 대규모 프로젝트에서 데이터 집계를 위해 초기화되지 않은 맵을 사용했습니다. 첫 번째 기록 시 애플리케이션이 안정적으로 패닉이 발생했습니다. 문제는 새 통계를 도입했을 때 프로덕션에서 발견되었습니다.


이야기

설명: 서비스가 초기화되지 않은 슬라이스를 JSON으로 API 응답에 보내고 있었습니다. 클라이언트는 [] 대신 null을 받았고, 두 가지 경우를 처리하기 위해 프론트엔드 스키마를 변경해야 했습니다.


이야기

설명: 캐싱 모듈에서 nil 맵과 빈 맵을 잘못 비교하여 요소가 있는지 잘못 판단했습니다. 이는 데이터베이스에 대한 불필요한 호출을 초래하여 성능을 저하시켰습니다.