나는 Go에 비교적 익숙하며 많은 작은 프로그램을 작성했습니다. 물론 녹에 대해서는 잘 모르지만 계속 지켜봐야합니다.
최근에 http://yager.io/programming/go.html을 읽은 후 기사가 실제로 인터페이스가 많지 않을 때 Go가 부당하게 비판하는 것처럼 보이므로 제네릭이 처리되는 두 가지 방법을 개인적으로 조사 할 것이라고 생각했습니다. 우아하게 성취 할 수 없었습니다. 나는 Rust 's Traits가 얼마나 강력했는지에 대한 과대 광고를 계속 들었고 Go에 대한 사람들의 비판 만했습니다. Go에서 약간의 경험을 쌓았을 때, 그것이 실제로 무엇이고 그 차이점이 무엇인지 궁금했습니다. 내가 찾은 것은 특성과 인터페이스가 매우 비슷하다는 것입니다! 궁극적으로, 내가 뭔가 빠졌는지 확신 할 수 없으므로 여기에 유사점에 대한 빠른 교육 요약이 있으므로 누락 된 것을 말해 줄 수 있습니다!
이제 설명서 에서 Go Interfaces를 살펴 보겠습니다 .
Go의 인터페이스는 객체의 동작을 지정하는 방법을 제공합니다. 무언가 할 수있는 경우 여기에서 사용할 수 있습니다.
지금까지 가장 일반적인 인터페이스는 Stringer
객체를 나타내는 문자열을 반환합니다.
type Stringer interface {
String() string
}
따라서 String()
정의 된 Stringer
객체 는 객체입니다. func (s Stringer) print()
거의 모든 객체 를 가져 와서 인쇄하는 형식 서명에 사용할 수 있습니다 .
우리는 또한 interface{}
어떤 물건을 가져야 합니다. 그런 다음 리플렉션을 통해 런타임에 유형을 결정해야합니다.
이제 Rust Traits의 문서를 살펴 보겠습니다 .
가장 간단하게, 특성은 0 개 이상의 메소드 서명 세트입니다. 예를 들어, 단일 메소드 서명으로 콘솔에 인쇄 할 수있는 항목에 대해 Printable 특성을 선언 할 수 있습니다.
trait Printable {
fn print(&self);
}
이것은 바로 Go 인터페이스와 매우 유사합니다. 내가 볼 수있는 유일한 차이점은 단순히 메소드를 정의하는 것이 아니라 특성의 '구현'을 정의한다는 것입니다. 그래서 우리는
impl Printable for int {
fn print(&self) { println!("{}", *self) }
}
대신에
fn print(a: int) { ... }
보너스 질문 : 특성을 구현하지만 사용하지 않는 함수를 정의하면 Rust에서 어떻게됩니까 impl
? 그냥 작동하지 않습니까?
Go의 인터페이스와 달리 Rust의 형식 시스템에는 형식 매개 변수가 interface{}
있어 컴파일러와 런타임에서 실제로 형식을 알고있는 동안 적절한 제네릭과 작업을 수행 할 수 있습니다 . 예를 들어
trait Seq<T> {
fn length(&self) -> uint;
}
는 모든 유형에서 작동하며 컴파일러 는 리플렉션을 사용하지 않고 컴파일 타임에 시퀀스 요소의 유형을 알고 있습니다.
이제 실제 질문 : 여기에 차이점이 있습니까? 그들은 정말 그 비슷한? 여기서 누락 된 더 근본적인 차이점이 없습니까? (사용상. 구현 세부 사항은 흥미롭지 만 궁극적으로 동일하게 작동하면 중요하지 않습니다.)
구문상의 차이점 외에도 실제 차이점은 다음과 같습니다.
- Go는
impl
Trat를 구현하기 위해 자동 메소드 디스패치 대 Rust require (?) 를 가지고 있습니다.- 우아함과 명시 적
- Rust는 리플렉션없이 적절한 제네릭을 허용하는 타입 파라미터를 가지고 있습니다.
- Go는 실제로 아무런 반응이 없습니다. 이것은 훨씬 더 강력한 유일한 방법이며 궁극적으로 다른 유형 서명을 사용하여 메서드를 복사하여 붙여 넣는 대신 사용할 수 있습니다.
이것 만이 사소한 차이가 아닌가? 그렇다면 Go 's Interface / Type 시스템은 실제로 인식 된 것만 큼 약하지 않은 것으로 보입니다.
AnyMap
은 Rust의 강점을 잘 보여주고 있으며, 특성 객체를 제네릭과 결합하여 Go에서 필연적으로 쓰여질 깨지기 쉬운 것을 안전하고 표현 적으로 추상화합니다map[string]interface{}
.