2012-05-30 3 views
5

bufio 패키지의 ReadBytes 메서드로 거의 충족되는 기능을 필요로하는 코드를 작성했습니다. 특히이 메서드는 특정 바이트가 발생할 때까지 Reader에서 읽습니다. 몇 바이트 (공간, 줄 바꿈 및 탭 주로) 중 하나를 만날 때까지 읽는 것이 필요합니다.기존 (표준) 패키지에 새 함수 추가

라이브러리의 소스를 살펴본 결과 bufio 구조체에서 사용하는 내부 버퍼에 액세스 할 수 있다면 어떻게해야하는지 알았습니다. 패키지를 "원숭이 패치"하고 다른 방법을 2 개 추가 할 수있는 방법이 있습니까? 또는 내가 필요한 기능을 얻는 또 다른 방법은 무엇입니까? 이 방법을 따라

+1

개인 숨겨진 필드가있는 주된 이유는 향후 구현이 사용자에게 영향을 미치지 않고 발전 할 수있게하는 것입니다. 바이트에 액세스하도록 허용하면이 보증이 깨집니다. 그래서 독자적인 (제한적인) Reader 구조체 및 메서드를 만드는 것보다 다른 적절한 방법을 보지 못합니다. –

+2

실제 문제 (특정 데이터 형식 읽기)에 대해 염두에두고있는 하나의 솔루션 (강화 된 bufio)에 대한 답변과 의견에서 알 수 있듯이 Go의 패키지 기능은 실제로 그렇게하지 못하도록 설계되었습니다. 다른 솔루션을 고려해 보거나 데이터 형식에 대한 세부 정보가 포함 된 다른 질문을 게시하고 "이 다중 구분 기호 형식을 읽는 좋은 방법은 무엇입니까?"라고 묻는 것이 좋습니다. – Sonia

답변

5

뭔가 (주의 : 테스트되지 않은 코드) :

type reader struct{ 
     *bufio.Reader // 'reader' inherits all bufio.Reader methods 
} 

func newReader(rd io.Reader) reader { 
     return reader{bufio.NewReader(rd)} 
} 

// Override bufio.Reader.ReadBytes 
func (r reader) ReadBytes(delim byte) (line []byte, err error) { 
     // here goes the monkey patch 
} 

// Or 

// Add a new method to bufio.Reader 
func (r reader) ReadBytesEx(delims []byte) (line []byte, err error) { 
     // here goes the new code 
} 

편집 : 나는이 원래 패키지 내부 (비 수출 기관)에 액세스 할 수 없습니다 도움을한다는 것을 주목해야합니다. 귀하의 의견에 그것을 지적 주셔서 감사합니다 Abhay.

+0

이렇게하면 bufio.Reader의 unexported 필드에 액세스 할 수 있습니까? –

+1

불행히도 아니,이 내부 구조체에 위임되는 호출이 발생할 것으로 보인다. 전체 구조체는 여전히 새로운 구조체에 포함되며 여전히 별도의 엔터티처럼 처리됩니다. 패키지 로컬 변수에 실제로 액세스 할 수 없습니다. 시도 주셔서 감사합니다! –

1

일반적으로 패키지 API를 사용하여 문제를 해결하는 것이 가장 좋습니다. 만약 당신이 unexported 기능에 접근 할 강력한 이유가 있다면, 패키지 소스를 복사 해킹하십시오. 그들이 BSD 스타일의 라이센스를 자유 주의적으로 사용합니다.

관련 문제