2 回答

TA貢獻1802條經驗 獲得超5個贊
從中得到提示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)
}))
}

TA貢獻1853條經驗 獲得超9個贊
一種方法是創建您自己的類型,將 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.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在您的情況下)。
一種方法是創建您自己的類型,將 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.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在您的情況下)。
- 2 回答
- 0 關注
- 142 瀏覽
添加回答
舉報