2012-05-30 34 views
5

Tôi đang viết một số mã cần chức năng gần như hài lòng bởi phương thức ReadBytes trong gói bufio. Cụ thể, phương thức đó đọc từ Reader cho đến khi nó gặp một byte cụ thể. Tôi cần một cái gì đó mà đọc cho đến khi nó gặp một trong số vài byte (không gian, dòng mới và tab chủ yếu).Thêm chức năng mới vào gói hiện có (tiêu chuẩn)

Tôi đã xem nguồn của thư viện và tôi biết phải làm gì nếu tôi có quyền truy cập vào bộ đệm trong được sử dụng bởi các cấu trúc bufio. Có cách nào tôi có thể "khỉ vá" gói và thêm một hoặc hai phương pháp cho nó? Hoặc một cách khác để có được chức năng tôi cần?

+1

Lý do chính là có các trường ẩn riêng tư để làm cho việc triển khai có thể tiến triển trong tương lai mà không ảnh hưởng đến người dùng. Cho phép bạn truy cập byte sẽ phá vỡ sự bảo đảm này. Vì vậy, tôi không nhìn thấy cách thích hợp khác hơn để làm cho riêng của bạn (giới hạn) Reader struct và phương pháp. –

+2

Câu hỏi của bạn là về một giải pháp (nâng cao bufio) bạn có trong đầu cho vấn đề thực sự của mình (đọc một định dạng dữ liệu nhất định). Nó có thể là tốt hơn để xem xét các giải pháp khác, hoặc thậm chí đăng một câu hỏi trên SO với các chi tiết của định dạng dữ liệu của bạn và hỏi, "một cách tốt để đọc định dạng nhiều dấu phân cách là gì?" – Sonia

Trả lời

5

Something cùng phương pháp này (thận trọng: Mã chưa được kiểm tra):

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 
} 

EDIT: Tôi nên lưu ý rằng này không giúp đỡ để truy cập gói internals gốc (không tổ chức xuất khẩu). Cảm ơn Abhay đã chỉ ra điều đó trong nhận xét của bạn.

+0

Bạn có thể truy cập vào các trường chưa được báo cáo của bufio.Đọc theo cách này không? –

+1

Thật không may, điều này dường như dẫn đến các cuộc gọi được ủy nhiệm cho cấu trúc bên trong. Toàn bộ cấu trúc vẫn được nhúng vào trong cấu trúc mới và vẫn được xử lý như một thực thể riêng biệt. Bạn không thực sự có quyền truy cập vào các biến địa phương gói của nó. Cảm ơn bạn đã thử! –

1

Cách tốt nhất là giải quyết các sự cố khi sử dụng API gói. Nếu bạn có lý do thuyết phục để truy cập các tính năng chưa được xuất bản, hãy sao chép nguồn gói và hack nó lên. Giấy phép theo phong cách BSD giống như tự do khi chúng đến.

Các vấn đề liên quan