这更多是与接口/功能/闭合/类型/ ...有关的通用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做到这一点?
从中得到提示http.HandlerFunc
,我可以想到以下内容
package main
import (
"bytes"
"fmt"
"io"
"strings"
)
// ReadData reads data from an io.Reader
func 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.Reader
type 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)
}))
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句