将新功能添加到现有(标准)包中

时间:2012-05-30 11:27:03

标签: go

我正在编写一些需要ReadBytes包中的bufio方法几乎满足的功能的代码。具体来说,该方法从Reader读取,直到遇到特定字节。我需要读取的内容,直到遇到几个字节(主要是空格,换行符和制表符)中的一个。

我查看了库的源代码,如果能够访问bufio结构使用的内部缓冲区,我知道该怎么做。有什么方法可以“修补”包裹并添加另一种方法吗?或者另一种获得我需要的功能的方法?

2 个答案:

答案 0 :(得分: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在你的评论中指出了这一点。

答案 1 :(得分:1)

通常最好使用包API解决问题。如果您有令人信服的理由访问未导出的功能,请复制包源并进行修改。 BSD式的许可证和他们来的一样自由。