Одним из способов может быть создание собственного типа, который сочетает io.Reader
и 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.File
file = ... // some File which needs to be closed
var reader io.Reader
reader = ... // get Reader from somewhere
var readCloser io.ReadCloser
readCloser = ReadCloseCombiner{reader, file}
// now pass readCloser around as needed
readCloser.Read(...)
readCloser.Close()
Если вы хотите что-то более гибкое, я бы предпочел иметь тип, который вместо этого принимает функцию чтения и закрытия, а затемВы можете передать ему анонимные функции (или даже reader.Read
/ file.Close
в вашем случае).