2013-06-14 2 views
2

Go 's io 패키지의 소스 코드를 읽었으며 완전히 이해하지 못하는 코드 조각을 발견했습니다.이 유형의 어설 션은 유효합니까?

type stringWriter interface { 
    WriteString(s string) (n int, err error) 
} 

type Writer interface { 
    Write(p []byte) (n int, err error) 
} 

타입 선언 w.(stringWriter)는 w (즉 작가)의 동적 유형이 StringWriter를 인터페이스를 구현 주장 여기서 여기서는

func WriteString(w Writer, s string) (n int, err error) { 
    if sw, ok := w.(stringWriter); ok { 
     return sw.WriteString(s) 
    } 
    return w.Write([]byte(s)) 
} 

이다. stringWriter 및 Writer의 유형 정의가 주어지면 이것이 가능한 방법을 알 수 없습니다. 이 코드가 맞다고 가정하면, 내가 누락 된 부분은 무엇입니까?

답변

5

쉽게 Writer뿐만 아니라 stringWriter를 구현하는 타입 구축 할 수 있습니다 :

type StringWriter struct{} 

func (s StringWriter) Write(in []byte) (int, error) { 
    return 0, nil 
} 
func (s StringWriter) WriteString(s string) (int, error) { 
    return s.Write([]byte(s)) 
} 

그래서 StringWriter.WriteStringStringWriter io.WriteString에 결과의 인스턴스를 전달 호출된다. io.WriteString 뒤에

논리는 다음과 작가에 대한 사용 WriteString는 이러한 방법 가 있거나 그렇지 않으면 다시 string-[]byte 변환 떨어질 경우. 인스턴스가 메소드를 구현하는지 여부를 테스트하려면 인터페이스가 사용되며, 이는 메소드 세트 일 뿐이며 쉽게 테스트 할 수 있습니다.

+0

그래서 분명히 거의 embarasing하고 있습니다. 키워드 앞에 너무 많은 시간이 걸리면'func WriteString (w Writer)'가 Writer 인터페이스를 구현하는 모든 것을 허용한다는 것을 잊어 버리게됩니다. 고맙습니다. –

관련 문제