2012-05-30 16 views
5

Estoy escribiendo un código que necesita funcionalidad que está casi satisfecho con el método ReadBytes en el paquete bufio. Específicamente, ese método lee desde un Reader hasta que encuentra un byte particular. Necesito algo que lea hasta que encuentre uno de cada dos bytes (espacio, nueva línea y pestaña principalmente).Agregar una nueva función a un paquete existente (estándar)

Miré la fuente de la biblioteca y sé qué hacer si tengo acceso al búfer interno utilizado por las estructuras bufio. ¿Hay alguna manera de que yo pueda "aplicar un parche de mono" al paquete y agregarle otro método o dos? ¿O alguna otra forma de obtener la funcionalidad que necesito?

+1

Una de las principales razones por las que hay campos ocultos privados es permitir que la implementación evolucione en el futuro sin afectar a los usuarios. Permitirle acceder a byte rompería esta garantía. Por lo tanto, no veo otra manera adecuada de crear su propia estructura y método de Lector (limitado). –

+2

Su pregunta es sobre una solución (mejora de bufio) que tiene en mente para su problema real (leer un determinado formato de datos). Como indican las respuestas y los comentarios, las características del paquete de Go fueron realmente diseñadas para impedirlo. Sería mejor considerar otras soluciones, o incluso publicar otra pregunta en SO con detalles de su formato de datos y preguntar: "¿Cuál es una buena forma de leer este formato de delimitación múltiple?" – Sonia

Respuesta

5

Algo a lo largo de este enfoque (precaución: código no probado):

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: Debería haber observado que este no ayuda para acceder a los componentes internos del paquete original (entidades no exportadas). Gracias Abhay por señalar eso en tu comentario.

+0

¿Puede acceder a los campos no exportados de bufio.Reader de esta manera? –

+1

Desafortunadamente no, esto parece dar como resultado que las llamadas sean delegadas a la estructura interna. Toda la estructura todavía está incrustada en la nueva y aún se trata como una entidad separada. En realidad, no tiene acceso a las variables locales del paquete. ¡Gracias por el intento! –

1

Por lo general, es mejor resolver problemas utilizando el paquete API. Sin embargo, si tiene un motivo convincente para acceder a funciones no exportadas, copie el origen del paquete y lo piratee. La licencia de estilo BSD es tan liberal como parece.

Cuestiones relacionadas