猿问

如何在 Java 中编写等同于匿名类的内容?

这更像是一个与接口/函数/闭包/类型/...相关的通用 Go 问题,但具有执行 I/O 的具体用例。


给定一个io.Reader变量,我想创建一个io.ReadCloser自定义Close()实现。


var file os.File

file = ... // some File which needs to be closed


var reader io.Reader

reader = ... // get Reader from somewhere


var readCloser io.ReadCloser

readCloser = ... // how to create a ReadCloser here?

在Java中,我会写这样的东西:


readCloser = new io.ReadCloser() {

    Read(p []byte) {

        reader.Read(p);

    }


    Close() {

        // my custom close implementation

        file.Close()

    }    

}


// now pass readCloser around as needed

如何用 Go 做到这一点?


白猪掌柜的
浏览 106回答 2
2回答

慕后森

从中得到提示http.HandlerFunc,我可以想到以下内容package mainimport (    "bytes"    "fmt"    "io"    "strings")// ReadData reads data from an io.Readerfunc ReadData(r io.Reader) {    buf := new(bytes.Buffer)    buf.ReadFrom(r)    s := buf.String()    fmt.Printf("read : %s \n", s)}// ReaderFunc takes a function and returns io.Readertype ReaderFunc func([]byte) (int, error)func (r ReaderFunc) Read(b []byte) (int, error) {    return r(b)}func main() {    // invoking ReadData with a regular io.Reader    r := strings.NewReader("data 123")    ReadData(r)    // invoking ReadData with an anonymous io.Reader    r = strings.NewReader("data 456")    ReadData(ReaderFunc(func(b []byte) (int, error) {        return r.Read(b)    }))}

暮色呼如

一种方法是创建您自己的类型,将 aio.Reader和 a结合起来io.Closer并实现io.ReadCloser接口。是这样的:type ReadCloseCombiner struct {    io.Reader    io.Closer}func (rcc ReadCloseCombiner) Read(p []byte) (n int, err error) {    return rcc.Reader.Read(p)}func (rcc ReadCloseCombiner) Close() error {    return rcc.Closer.Close()}并像这样使用它:var file *os.Filefile = ... // some File which needs to be closedvar reader io.Readerreader = ... // get Reader from somewherevar readCloser io.ReadCloserreadCloser = ReadCloseCombiner{reader, file}// now pass readCloser around as neededreadCloser.Read(...)readCloser.Close()如果您想要更灵活的东西,我会考虑使用一种类型来代替读取和关闭函数,然后您可以将它传递给匿名函数(或者甚至reader.Read/file.Close在您的情况下)。一种方法是创建您自己的类型,将 aio.Reader和 a结合起来io.Closer并实现io.ReadCloser接口。是这样的:type ReadCloseCombiner struct {    io.Reader    io.Closer}func (rcc ReadCloseCombiner) Read(p []byte) (n int, err error) {    return rcc.Reader.Read(p)}func (rcc ReadCloseCombiner) Close() error {    return rcc.Closer.Close()}并像这样使用它:var file *os.Filefile = ... // some File which needs to be closedvar reader io.Readerreader = ... // get Reader from somewherevar readCloser io.ReadCloserreadCloser = ReadCloseCombiner{reader, file}// now pass readCloser around as neededreadCloser.Read(...)readCloser.Close()如果您想要更灵活的东西,我会考虑使用一种类型来代替读取和关闭函数,然后您可以将它传递给匿名函数(或者甚至reader.Read/file.Close在您的情况下)。
随时随地看视频慕课网APP

相关分类

Go
我要回答