프로그래밍Go 개발자

Go에서 어떤 데이터 유형이 비교 가능한(comparable) 것으로 간주되며, 비교할 수 없는 유형을 비교하려고 할 때 어떤 일이 발생합니까? 이것이 map 및 set의 사용에 어떤 영향을 미칩니까?

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

답변

Go에서 변수는 == 연산자를 사용하여 서로 비교하거나 map의 키로 사용할 수 있는데, 이는 해당 타입이 comparable일 경우만 가능합니다. 비교 가능한 것들은:

  • 모든 숫자 타입(int, float64, ...)
  • 문자열(string, rune)
  • 포인터
  • 채널
  • 인터페이스는 그 값이 비교 가능한 경우
  • 배열(array) 및 구조체는 모든 필드가 비교 가능할 경우

슬라이스, 맵, 함수 — 비교 불가능합니다!

이런 값을 비교하려고 하면 컴파일 오류가 발생합니다. 예를 들어:

var a = []int{1,2,3} var b = []int{1,2,3} printf("%v", a==b) // compile error: slice can only be compared to nil

map에서 키로 사용하려면 값이 반드시 비교 가능해야 합니다. 타입이 맞지 않으면 컴파일 오류가 발생합니다.

함정 질문

"부분적으로만 비교할 수 없는 필드를 가진 두 구조체가 비교 가능한 것으로 간주될 수 있습니까?"

많은 사람들이 "예"라고 대답하지만, 이는 잘못된 답변입니다. 구조체의 필드 중 하나라도 비교할 수 없는 경우(예: 슬라이스나 맵인 경우) 전체 구조체는 비교할 수 없게 됩니다.

예제:

type T struct { A int S []string } var t1, t2 T t1 == t2 // compile error: Slices are not comparable

주제에 대한 세부 사항을 모르는 것으로 인한 실제 오류 예제


이야기

개발자가 슬라이스를 map의 키로 사용하여 계산 결과를 캐시하려고 했으나 컴파일 오류가 발생했습니다. 명시적 직렬 변환기를 사용하여 문자열로 대체하여 문제가 해결되었습니다.


이야기

구조체에 새로운 필드(슬라이스 타입)를 추가할 때, 이를 키로 사용하는 맵 때문에 프로젝트가 갑자기 컴파일되지 않았습니다. 이유: 이제 구조체가 비교할 수 없게 되었지만, 이는 중첩 구조체에 영향을 미친다고 예상하지 못했습니다.


이야기

슬라이스가 포함된 구조체로 집합(set)을 만들기 위해 map을 사용하려고 했지만, 비교 규칙을 이해하지 못하고 요소를 비교하려 할 때 여러 런타임 오류가 발생했습니다. 그러나 문제는 그러한 키로 컴파일할 수 없다는 것이었습니다.