Go에서 변수는 == 연산자를 사용하여 서로 비교하거나 map의 키로 사용할 수 있는데, 이는 해당 타입이 comparable일 경우만 가능합니다. 비교 가능한 것들은:
int, float64, ...)string, rune)슬라이스, 맵, 함수 — 비교 불가능합니다!
이런 값을 비교하려고 하면 컴파일 오류가 발생합니다. 예를 들어:
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을 사용하려고 했지만, 비교 규칙을 이해하지 못하고 요소를 비교하려 할 때 여러 런타임 오류가 발생했습니다. 그러나 문제는 그러한 키로 컴파일할 수 없다는 것이었습니다.