Go에 제네릭이없는 이유는 무엇입니까?
면책 조항 : 나는 Go와 함께 하루 동안 만 연주 했으므로 많이 놓쳤을 가능성이 큽니다.
Go의 generics / templates / whatsInAName에 대한 실제 지원이없는 이유를 아는 사람이 있습니까? 따라서 generic map
이 있지만 컴파일러에서 제공하는 반면 Go 프로그래머는 자체 구현을 작성할 수 없습니다. Go를 가능한 한 직교로 만드는 것에 대한 모든 이야기와 함께 왜 일반적인 유형을 사용할 수 있지만 새로운 유형을 만들 수 없습니까?
특히 함수형 프로그래밍의 경우 람다, 클로저가 있지만 제네릭이없는 정적 유형 시스템에서는 어떻게 일반적인 고차 함수를 작성 filter(predicate, list)
합니까? 링크리스트 등은, interface{}
타입 안전성 을 희생시켜 행할 수있다 .
SO / Google에 대한 빠른 검색으로 통찰력이 드러나지 않았으므로 일반 정보가 나중에 Go에 추가되는 것처럼 보입니다. 나는 톰슨을 자바 사람들보다 더 잘 할 것이라고 믿지만 왜 제네릭을 사용하지 않는가? 아니면 계획되어 있고 아직 구현되지 않았습니까?
이 답변은 여기에서 찾을 수 있습니다 : http://golang.org/doc/faq#generics
Go에 일반 유형이없는 이유는 무엇입니까?
제네릭은 언젠가 추가 될 수 있습니다. 우리는 일부 프로그래머가 이해하지만 긴급한 느낌은 없습니다.
제네릭은 편리하지만 형식 시스템과 런타임에서 복잡해집니다. 복잡성에 비례하여 가치를 제공하는 디자인을 아직 찾지 못했지만 디자인은 계속 생각하고 있습니다. 한편, Go의 내장 된 맵과 슬라이스와 빈 인터페이스를 사용하여 컨테이너를 생성하는 기능 (명시 적 언 박싱 포함)은 일반적으로 덜 매끄럽다면 제네릭이 가능하게하는 코드를 작성할 수 있음을 의미합니다.
이것은 여전히 공개 된 문제입니다.
이동 2
https://blog.golang.org/go2draft 에 제네릭을위한 초안 디자인이 있습니다 .
이동 1
러스 콕스의 이동 베테랑의 하나는 쓴 일반 딜레마를받을 블로그 게시물 그가 요구하는을,
… 느린 프로그래머, 느린 컴파일러 및 부풀린 바이너리 또는 느린 실행 시간을 원하십니까?
느린 프로그래머는 제네릭이 없기 때문에 느린 컴파일러는 제네릭과 같은 C ++로 인해 발생하며 느린 실행 시간은 Java가 사용하는 boxing-unboxing 방식에서 비롯됩니다.
블로그에 언급되지 않은 네 번째 가능성은 C # 경로입니다. C ++에서와 같이 특수 코드를 생성하지만 필요할 때 런타임에 생성합니다. 정말 마음에 들지만 Go는 C #과 매우 다르기 때문에 전혀 적용 할 수 없습니다.
필자는 일반적인 Java 프로그래밍 과 같은 일반적인 Java 1.4 기술을 사용하여 interface{}
컴파일 시간 유형 안전의 손실 외에도 boxing-unboxing (우리가하는 일 때문에)과 정확히 동일한 문제로 어려움 을 겪습니다. int와 같은 작은 유형의 경우 Go interface{}
는 인터페이스에 캐스트 된 int 목록이 인접한 메모리 영역을 차지하고 일반 int의 두 배에 불과한 공간을 차지하도록 유형을 최적화합니다 . interface{}
하지만 에서 캐스팅하는 동안 런타임 검사 오버 헤드가 여전히 있습니다 . 참조 .
일반 지원을 추가하는 모든 프로젝트 (여러 개가 있고 모두 흥미 롭습니다)는 컴파일 타임 코드 생성의 C ++ 경로를 균등하게 따릅니다.
제네릭이 현재 내장되어 있지는 않지만 코드를 생성하는 작은 유틸리티와 함께 주석을 사용하는 몇 가지 외부 제네릭 구현이 있습니다.
다음은 그러한 구현 중 하나입니다. http://clipperhouse.github.io/gen/
Go 2에 대한 파라 메트릭 다형성 (일반) 이 고려되고 있습니다.
이 접근법은 유형 매개 변수에 대한 제한 조건을 표현하는 데 사용할 수 있는 계약 개념을 도입합니다 .
contract Addable(a T) {
a + a // Could be += also
}
그런 계약은 다음과 같이 사용될 수 있습니다.
func Sum(type T Addable)(l []T) (total T) {
for _, e := range l {
total += e
}
return total
}
이 단계 의 제안 입니다.
귀하의 filter(predicate, list)
기능이 같은 유형의 매개 변수를 사용하여 구현 될 수있다 :
func Filter(type T)(f func(T) bool, l []T) (result []T) {
for _, e := range l {
if f(e) {
result = append(result, e)
}
}
return result
}
이 경우 구속 할 필요가 없습니다 T
.
참고URL : https://stackoverflow.com/questions/3912089/why-no-generics-in-go
'Programing' 카테고리의 다른 글
호스트에서 Docker 서비스를 연결하는 방법은 무엇입니까? (0) | 2020.07.22 |
---|---|
제품 번들 크기를 줄이는 방법은 무엇입니까? (0) | 2020.07.22 |
Facebook React에서 코드 재사용을 위해 믹스 인과 컴포넌트 사용 (0) | 2020.07.22 |
무엇을합니까. (0) | 2020.07.22 |
특성으로 Java 8 기본 메소드 : 안전? (0) | 2020.07.22 |