2012-06-15 2 views
1

Go 언어에는 인터페이스 유형이 기능으로 C 스타일 인터페이스와 유사합니다. Go의 인터페이스 유형은 시행되지 않는 것 같습니다. 실제로 유형에 적용되지 않고 프로토콜을 정의하기 만합니다. 강제적이지 않으므로 인터페이스를 사용하는 것이 좋습니다.Go의 인터페이스가 강제로 적용되지 않으면 필요합니까?

+5

"적용"이란 무엇을 의미합니까? 값은 인터페이스를 구현하기 위해 인터페이스를 구현해야하며 이는 유형 검사기에 의해 강제됩니다. 형식이 인터페이스를 구현한다고 선언 할 필요는 없지만 이것은 의도적으로 문제가되지 않습니다. – SteveMcQwark

+5

"C 스타일 인터페이스"란 무엇입니까? 그리고 Go가 인터페이스를 강제하지 않는다는 것은 무엇을 의미합니까? Go 컴파일러는 특정 인터페이스를 사용하는 함수에 유형을 전달할 때 인터페이스가 충족되고 컴파일시 정적으로 수행하며 Go를 훌륭하게 만드는 기능 중 하나라는 사실을 분명히 강요합니다. – uriel

+0

-1 :이 질문은 Go의 인터페이스가 시행되지 않는다는 잘못된 개념을 기반으로합니다. http://play.golang.org/p/V65p3FMvPO – weberc2

답변

7

예. Go는 타입 계층 구조를 만들 수 없기 때문에 인터페이스는 일부 다형성을 허용하는 데 매우 중요합니다. 패키지 sort에 정의 된 sort.Interface을 고려

type Interface interface { 
    // Len is the number of elements in the collection. 
    Len() int 
    // Less returns whether the element with index i should sort 
    // before the element with index j. 
    Less(i, j int) bool 
    // Swap swaps the elements with indexes i and j. 
    Swap(i, j int) 
} 

sort 패키지는이 인터페이스를 구현하는 객체를 예상하는 기능 sort(data Interface)이 포함되어 있습니다. 인터페이스가 없으면 그런 형태의 다형성은 불가능합니다. 실제로이 인터페이스를 구현 한 유형에 주석을 달지 않아도된다는 사실은 부적합합니다.

멋진 부분은 유형이 동일한 패키지에 정의되어있는 한 기본 유형에이 인터페이스를 구현할 수도 있다는 것입니다. 그래서 다음 코드는 정수의 정렬 배열 정의

type Sequence []int 

// Methods required by sort.Interface. 
func (s Sequence) Len() int { 
    return len(s) 
} 
func (s Sequence) Less(i, j int) bool { 
    return s[i] < s[j] 
} 
func (s Sequence) Swap(i, j int) { 
    s[i], s[j] = s[j], s[i] 
} 
+4

"기본 유형에이 인터페이스를 구현할 수도 있습니다."즉, 기본 유형과 구조적으로 같을 수있는 사용자 정의 유형에 대한 메소드를 정의 할 수 있습니다. 'Sequence'와'[int]는 서로 다른 타입입니다. – newacct

+0

'Sequence' 대신'[] int'에서 같은 메소드를 정의하고 실제로 OA의 목표를 달성 할 수 없었습니까? 또는 원시 타입에 대한 새로운 메소드를 작성할 수 없습니까? – matthias

+0

mathias : 1 년 이상 무작위로 봤습니다.하지만 아니요, 기본 유형에 새로운 메소드를 정의 할 수 없습니다. – twotwotwo

0

내가 statical 런타임에 모두 유형 검사가, 무엇인지 알고 희망을, 그러나 나는 "인터페이스를 강화"하는 것입니다 무엇인지 전혀 모른다.

관련 문제