2012-05-30 30 views
5

我正在編寫一些代碼,需要bufio包中ReadBytes方法幾乎滿足的功能。具體來說,該方法從Reader中讀取,直到遇到特定字節。我需要讀取的內容直到遇到一對字節(主要是空格,換行符和標籤)。將新功能添加到現有(標準)包

我查看了庫的源代碼,我知道如果可以訪問由bufio結構使用的內部緩衝區,該怎麼辦。有沒有什麼辦法可以「修補」這個軟件包並添加另外一個或兩個方法?或者另一種獲得我需要的功能的方式?

+1

存在隱藏隱藏字段的主要原因是爲了使實現在將來能夠發展而不會影響用戶。允許你訪問字節將打破這種保證。所以我沒有看到其他合適的方法,而不是製作自己的(有限的)Reader結構和方法。 –

+2

你的問題是關於一個解決方案(增強bufio),你考慮到你真正的問題(閱讀某種數據格式)。正如答案和評論所指出的,Go的包裝特性實際上是爲了阻止你這樣做而設計的。考慮其他解決方案可能會更好,甚至可以在SO上發佈另一個關於數據格式細節的問題,並詢問「閱讀這種多分隔符格式的好方法是什麼?」。 – 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的未導出的字段嗎? –

+1

不幸的是,這似乎導致調用被委託給內部結構。整個結構仍然嵌入到新結構中,並仍然像一個單獨的實體一樣對待。你實際上並沒有訪問它的包本地變量。謝謝你的嘗試! –

1

通常最好使用包API解決問題。如果您有一個令人信服的理由來訪問未導出的功能,請複製軟件包源並將其破解。 BSD式的許可證就像他們來的那樣自由。

相關問題