Go에서는 명시적인 초기값 없이 선언된 변수는 자동으로 유효하지 않은 값 (zero values)을 가지며, 이는 다양한 유형에 따라 다릅니다:
int — 0bool — falsestring — ""이것은 편리하지만 (메모리에 쓰레기가 없기 때문에) 위험할 수 있습니다: 예를 들어 슬라이스와 맵과 같은 일부 유형은 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 맵과 빈 맵을 잘못 비교하여 요소가 있는지 잘못 판단했습니다. 이는 데이터베이스에 대한 불필요한 호출을 초래하여 성능을 저하시켰습니다.