IT story

golang 데이터 구조를 설정하지 않는 이유

hot-time 2020. 8. 25. 20:14
반응형

golang 데이터 구조를 설정하지 않는 이유


나는 세트가 필요한 "The go programming lanaguage"연습 문제 # 1.4를 풀려고 노력하고 있습니다. 집합 유형을 만들 수 있지만 언어에 왜 포함되지 않습니까? 구아바도 시작된 Google에서 왔는데 언어 디자이너가 기본 데이터 구조에 대한 지원 추가를 선택하지 않은 이유는 무엇입니까? 왜 당신의 사용자가 집합처럼 기본적인 것을 위해 자신의 구현을 만들도록 강요 하는가?


부분적으로, Go에는 제네릭이 없기 때문에 (따라서 모든 유형에 대해 하나의 세트 유형이 필요하거나 반사에 폴백하여 다소 비효율적입니다).

부분적으로, "개별 요소를 세트에 추가 / 제거"하고 "상대적으로 공간 효율적"이면를 사용하여 상당한 양을 얻을 수 있습니다 map[yourtype]bool(그리고 세트의 true모든 요소에 대해 값을 로 설정). ) 또는 공간 효율성을 높이기 위해 빈 구조체를 값으로 사용 _, present = the_setoid[key]하고 존재 여부를 확인 하는 사용할 수 있습니다.


한 가지 이유는 맵에서 세트를 생성하기가 쉽기 때문입니다.

s := map[int]bool{5: true, 2: true}
_, ok := s[6] // check for existence
s[8] = true // add element 
delete(s, 2) // remove element

노동 조합

s_union := map[int]bool{}
for k, _ := range s1{
    s_union[k] = true
}
for k, _ := range s2{
    s_union[k] = true
}

교차로

s_intersection := map[int]bool{}
for k,_ := range s1 { 
  if s2[k] {
    s_intersection[k] = true
  }
}

다른 모든 집합 연산을 구현하는 것은 실제로 그렇게 어렵지 않습니다.


또 다른 가능성은 하나 이상의 패키지 가있는 비트 세트를 사용 하거나 내장 된 패키지를 사용할 수 있습니다 . 이 경우 기본적으로 객체를 인덱스로 변환하는 방법을 정의해야합니다.


Vatine이 쓴 것처럼 : go에는 제네릭이 없기 때문에 표준 라이브러리가 아닌 언어의 일부 여야합니다. 이를 위해 키워드 세트, 공용체, 교차점, 차이, 하위 집합으로 언어를 오염시켜야합니다.

다른 이유는 세트의 "올바른"구현이 무엇인지 전혀 명확하지 않기 때문입니다.

  1. 기능적 접근 방식이 있습니다.

    func IsInEvenNumbers(n int) bool {
        if n % 2 == 0 {
            return true
        }
       return false
    }
    

이것은 모든 짝수 정수의 집합입니다. 매우 효율적인 조회 및 결합, 교차, 차이 및 하위 집합을 기능 구성으로 쉽게 수행 할 수 있습니다.

  1. 아니면 달리가 보여준 것처럼 has-like 접근 방식을 사용합니다.

값과 관련된 것을 저장하기 때문에 맵에는 그 문제가 없습니다.

참고 URL : https://stackoverflow.com/questions/34018908/golang-why-dont-we-have-a-set-datastructure

반응형