2012-05-30 3 views
5

Sto scrivendo un codice che ha bisogno di funzionalità che è quasi soddisfatta dal metodo ReadBytes nel pacchetto bufio. In particolare, quel metodo legge da un Reader finché non incontra un particolare byte. Ho bisogno di qualcosa che legga fino a quando non incontra uno su due byte (spazio, newline e tab principalmente).L'aggiunta di una nuova funzione a uno già esistente (standard) pacchetto

Ho esaminato il codice sorgente della libreria e so cosa fare se ho accesso al buffer interno utilizzato dalle strutture bufio. C'è un modo per "riprodurre patch" del pacchetto e aggiungere un altro metodo o due? O un altro modo per ottenere la funzionalità di cui ho bisogno?

+1

Una delle principali ragioni ci sono campi privati ​​nascosti è quello di rendere possibile per l'attuazione di evolversi in futuro senza impatto sugli utenti. Consentendo di accedere a byte, si rompe questa garanzia. Quindi non vedo altro modo corretto di creare la propria (limitata) struttura e metodo Reader. –

+2

La tua domanda riguarda una soluzione (miglioramento del bufio) che hai in mente per il tuo problema reale (leggendo un determinato formato di dati). Come indicano le risposte e i commenti, le funzionalità del pacchetto di Go sono state effettivamente progettate per impedirti di farlo. Potrebbe essere meglio prendere in considerazione altre soluzioni o anche postare un'altra domanda su SO con i dettagli del formato dei dati e chiedere "qual è un buon modo per leggere questo formato di delimitatore multiplo?" – Sonia

risposta

5

Qualcosa seguendo questo approccio (attenzione: codice non testato):

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: ho dovuto notare che questo non aiuto per accedere agli interni originali del pacchetto (entità non esportati). Grazie Abhay per averlo indicato nel tuo commento.

+0

Puoi accedere ai campi non pubblicati di bufio.Reader in questo modo? –

+1

Purtroppo no, sembra che le chiamate vengano delegate alla struttura interna. L'intera struttura è ancora incorporata nella nuova e viene ancora trattata come un'entità separata. In realtà non hai accesso alle variabili locali del pacchetto. Grazie per il tentativo però! –

1

Di solito è meglio per risolvere i problemi utilizzando l'API pacchetto. Se hai un motivo valido per accedere a funzionalità non esportate, copia la sorgente del pacchetto e modificale. La licenza in stile BSD è tanto liberale quanto loro.

Problemi correlati