Golang 中的 io 包詳解:組合接口
io.ReadWriter
// ReadWriter is the interface that groups the basic Read and Write methods.
type ReadWriter interface {
Reader
Writer
}
是對Reader和Writer接口的組合,聚合了基本的讀寫操作。簡單示例如下:
package main
import (
"bytes"
"fmt"
"io"
)
func main() {
var buf bytes.Buffer
rw := io.ReadWriter(&buf)
// 寫入數(shù)據(jù)
_, err := rw.Write([]byte("hello world"))
if err != nil {
panic(err)
}
// 讀取數(shù)據(jù)
var data = make([]byte, 11)
_, err = rw.Read(data)
if err != nil {
panic(err)
}
fmt.Println(string(data))
}
io.ReadCloser
// ReadCloser is the interface that groups the basic Read and Close methods.
type ReadCloser interface {
Reader
Closer
}
是對Reader和Closer接口的組合,聚合了基本的讀操作和關閉操作。使用 ReadCloser 接口時,一般會通過 NewReader 或其它方式獲取一個 io.ReadCloser 對象,然后通過 Read 方法不斷讀取數(shù)據(jù),直到數(shù)據(jù)讀取結束,最后通過 Close 方法釋放資源。
io.WriteCloser
// WriteCloser is the interface that groups the basic Write and Close methods.
type WriteCloser interface {
Writer
Closer
}
是對Writer和Closer接口的組合,聚合了基本的寫操作和關閉操作。使用 WriteCloser 接口時,一般會通過 NewWriter 或其它方式獲取一個 io.WriteCloser 對象,然后通過 Write 方法不斷寫入數(shù)據(jù),直到數(shù)據(jù)寫入結束,最后通過 Close 方法釋放資源。簡單示例如下:
package main
import (
"bufio"
"compress/gzip"
"os"
)
func main() {
f, err := os.Create("test.gz")
if err != nil {
panic(err)
}
defer f.Close()
// 通過 gzip.NewWriter 方法創(chuàng)建一個 io.WriteCloser 對象
// 用于將數(shù)據(jù)壓縮并寫入文件中
w := gzip.NewWriter(f)
defer w.Close()
// 將數(shù)據(jù)寫入到 io.WriteCloser 對象中
writer := bufio.NewWriter(w)
_, err = writer.WriteString("hello world")
if err != nil {
panic(err)
}
writer.Flush()
}
首先通過 os.Create 方法創(chuàng)建一個文件對象 f,然后通過 gzip.NewWriter 方法創(chuàng)建一個 io.WriteCloser 對象 w,該對象將數(shù)據(jù)寫入到 f 中,并對數(shù)據(jù)進行壓縮。接著通過 bufio.NewWriter 方法創(chuàng)建一個 bufio.Writer 對象 writer,該對象將數(shù)據(jù)寫入到 io.WriteCloser 對象中。最后調(diào)用 writer.Flush 方法將緩沖區(qū)中的數(shù)據(jù)寫入到 io.WriteCloser 對象中,然后釋放資源。
io.ReadWriteCloser
// ReadWriteCloser is the interface that groups the basic Read, Write and Close methods.
type ReadWriteCloser interface {
Reader
Writer
Closer
}
是對 Reader、Writer 和 Closer 接口的組合,聚合了基本的讀寫操作和關閉操作。使用 ReadWriteCloser 接口時,可以通過 Read 方法從數(shù)據(jù)源讀取數(shù)據(jù),通過 Write 方法寫入數(shù)據(jù)到數(shù)據(jù)接收器中,最后通過 Close 方法釋放資源。
io.ReadSeeker
// ReadSeeker is the interface that groups the basic Read and Seek methods.
type ReadSeeker interface {
Reader
Seeker
}
是對 Reader 和 Seeker 接口的組合,聚合了基本的讀取和移位操作。使用 ReadSeeker 接口時,可以通過 Read 方法從數(shù)據(jù)源讀取數(shù)據(jù),通過 Seek 方法在數(shù)據(jù)源中定位讀取位置,然后再通過 Read 方法繼續(xù)讀取數(shù)據(jù)。簡單示例:
package main
import (
"fmt"
"io"
"strings"
)
func main() {
s := strings.NewReader("0123456789")
rs := io.ReadSeeker(s)
// 讀取前 4 個字節(jié)
var data = make([]byte, 4)
_, err := rs.Read(data)
if err != nil {
panic(err)
}
fmt.Println(string(data))
// 定位到第 6 個字節(jié)
offset, err := rs.Seek(2, io.SeekCurrent)
if err != nil {
panic(err)
}
fmt.Printf("current offset:%d\n", offset)
// 讀取后 5 個字節(jié)
data = make([]byte, 5)
_, err = rs.Read(data)
if err != nil {
panic(err)
}
fmt.Println(string(data))
}
io.ReadSeekCloser
// ReadSeekCloser is the interface that groups the basic Read, Seek and Close
// methods.
type ReadSeekCloser interface {
Reader
Seeker
Closer
}
是對 Reader、Seeker 和 Closer 接口的組合,聚合了基本的讀操作、移位操作和關閉操作。使用 ReadSeekCloser 接口時,可以通過 Read 方法從數(shù)據(jù)源讀取數(shù)據(jù),通過 Seek 方法在數(shù)據(jù)源中定位讀取位置,最后通過 Close 方法釋放資源。
io.WriteSeeker
// WriteSeeker is the interface that groups the basic Write and Seek methods.
type WriteSeeker interface {
Writer
Seeker
}
是對 Writer 和 Seeker 接口的組合,聚合了基本的寫操作和移位操作。
io.ReadWriteSeeker
// ReadWriteSeeker is the interface that groups the basic Read, Write and Seek methods.
type ReadWriteSeeker interface {
Reader
Writer
Seeker
}
是對 Reader、Writer 和 Seeker 接口的組合,聚合了基本的讀寫操作和移位操作。