프로그래밍백엔드 개발자

Go에서 빈 구조체 struct{}란 무엇이며 언제 사용해야 합니까? 메모리 최적화와 집합(set) 또는 신호를 위한 채널 구현과 관련하여 그것의 가능성과 세부 사항은 무엇입니까?

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

답변

Go에서 struct{} 형식은 필드가 없는 구조체로 0 바이트의 메모리를 차지합니다. 이것은 무언가의 존재 사실이 중요하지만 데이터는 필요하지 않은 경우에 자원을 최소화하기 위해 사용되는 귀중한 특성입니다. 예를 들어, 집합(set), 신호 구조체 또는 이벤트 채널 구현에 사용됩니다.

집합 용도 예제:

mySet := make(map[string]struct{}) mySet["foo"] = struct{}{} if _, ok := mySet["foo"]; ok { fmt.Println("foo가 mySet에 존재합니다") }
  • struct{}는 키의 존재를 표시하는 값으로 사용됩니다.
  • map[string]bool과 달리 struct{} 옵션은 메모리 절약 측면에서 더 효율적입니다.

신호를 위한 채널:

done := make(chan struct{}) // 고루틴은 완료 신호를 기다립니다 <-done
  • 이 채널을 통해 데이터가 아닌 단순한 이벤트가 전송됩니다.

함정 질문

집합을 구현할 때 map[string]struct{}와 map[string]bool의 차이점은 무엇입니까? 왜 map[string]struct{}가 더 바람직하며 단점이 있습니까?

답변:

  • map[string]struct{}는 값에 대해 0 바이트를 사용하며, 가장 컴팩트한 옵션으로 대량의 데이터에서 메모리를 절약합니다.
  • map[string]bool은 값에 대해 1 바이트를 필요로 합니다(내부적으로는 정렬 때문에 더 많은 메모리를 차지할 수 있습니다).
  • 두 버전 모두 논리는 동일하며, 값의 역할은 중요하지 않으며 오직 키의 존재만이 중요합니다.
  • map[string]struct{}의 단점: 갑자기 논리적 값이 필요할 경우 true가 표시된 모든 값의 목록을 빠르게 얻을 수 없습니다. 여전히 키를 통해 반복해야 합니다.

예제:

set := make(map[string]struct{}) set["Alice"] = struct{}{} _, exists := set["Alice"] // true flags := make(map[string]bool) flags["Alice"] = true _, exists := flags["Alice"] // true

주제에 대한 세부사항 미숙지로 인한 실제 오류 예제


이야기

고유한 식별자를 저장하기 위한 프로젝트에서 map[string]bool을 사용했으며, 데이터가 증가함에 따라 메모리 소비가 크게 증가했습니다. map[string]struct{}로 변경하며 메모리 소비량이 두 배로 줄었습니다.


이야기

초보자는 chan bool을 통해 고루틴의 완료 신호를 보냈습니다. 많은 고루틴이 있을 때 값 전송이 과도한 문제가 발생했습니다. true 또는 false가 도착했는지 분석되지 않았습니다. chan struct{}로 바꾸면서 아키텍처의 부정확성이 드러났고 코드를 단순화할 수 있었습니다.


이야기

라이브러리에서 string을 값으로 사용한 map으로 집합을 만들었습니다. 이것은 너무 많은 메모리를 차지했습니다. Code Review 후 map[타입]struct{}로 변경했습니다. 이 오류는 부하 테스트 중 메모리 프로파일 분석 후 OOM으로 인해 애플리케이션이 중단될 때 발견되었습니다.