golang,go,博客,开源,编程
io.Reader
Read(p []byte) (n int, err error)
,用于从数据源读取数据到字节切片 p
中,返回实际读取的字节数和可能的错误。io.Writer
Write(p []byte) (n int, err error)
,将字节切片 p
中的数据写入目标,返回实际写入的字节数和错误。io.Closer
Close() error
,用于释放文件、网络连接等资源。io.Seeker
Seek(offset int64, whence int) (int64, error)
,通过 whence
(SeekStart
、SeekCurrent
、SeekEnd
)调整读写位置。ReadWriter
(组合 Reader
和 Writer
)、ReadCloser
(组合 Reader
和 Closer
),提供多操作能力的集成接口。io.Copy(dst Writer, src Reader) (written int64, err error)
src
复制到 dst
,自动处理底层缓冲和错误。io.CopyN(dst Writer, src Reader, n int64) (written int64, err error)
n
字节的数据。io.ReadAll(r Reader) ([]byte, error)
EOF
,返回完整字节切片。io.ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
min
字节,否则返回 ErrShortBuffer
。Go 标准库的多个包实现了 io
接口,常见类型包括:
strings.Reader
和 bytes.Reader
Seek()
方法)bufio
包bufio.Reader
),减少系统调用次数,提升性能os.File
Reader
和 Writer
接口,支持读写本地文件io.Pipe
实现了 Reader
接口的类型包括:
os.File
:用于文件操作。bytes.Reader
:用于读取字节切片。strings.Reader
:用于读取字符串。bufio.Reader
:提供带缓冲区的读取功能。示例:使用 os.File
实现 Reader
接口读取文件内容
package main
import (
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("example.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
buffer := make([]byte, 1024)
for {
n, err := file.Read(buffer)
if err == io.EOF {
break
}
if err != nil {
fmt.Println("Error reading file:", err)
return
}
fmt.Print(string(buffer[:n]))
}
}
Writer
接口Writer
接口用于向数据目标写入数据。其定义如下:
type Writer interface {
Write(p []byte) (n int, err error)
}
Write(p []byte) (n int, err error)
:将 p
中的 len(p)
个字节写入数据目标。返回实际写入的字节数 n
和可能发生的错误 err
。如果写入的数据少于提供的数据,err
必须非 nil
。实现了 Writer
接口的类型包括:
os.File
:用于文件操作。bytes.Buffer
:用于在内存中读写数据。bufio.Writer
:提供带缓冲区的写入功能。net.Conn
:用于网络连接的读写。示例:使用 os.File
实现 Writer
接口写入文件
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Create("example.txt")
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer file.Close()
content := []byte("Hello, Go I/O!")
n, err := file.Write(content)
if err != nil {
fmt.Println("Error writing to file:", err)
return
}
fmt.Printf("Wrote %d bytes to file\n", n)
}
Closer
接口Closer
接口用于表示可以关闭的资源,其定义如下:
type Closer interface {
Close() error
}
实现了 Closer
接口的类型包括:
os.File
:文件类型。net.Conn
:网络连接类型。compress/gzip.Writer
:GZIP 压缩写入器。示例:使用 os.File
实现 Closer
接口关闭文件
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Create("example.txt")
if err != nil {
fmt.Println("Error creating file:", err)
return
}
// 使用 defer 确保在函数退出时关闭文件
defer file.Close()
// 文件操作代码
}
Seeker
接口Seeker
接口用于表示可以在数据流中定位位置的类型,其定义如下:
type Seeker interface {
Seek(offset int64, whence int) (ret int64, err error)
}
Seek(offset int64, whence int) (ret int64, err error)
:设置下一次读写操作的偏移量。whence
参数指定基准位置,常用的值有:
io.SeekStart
:从文件开头开始计算。io.SeekCurrent
:从当前位置开始计算。io.SeekEnd
:从文件末尾开始计算。示例:使用 os.File
实现 Seeker
接口定位文件位置
package main
import (
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("example.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
// 将文件指针移动到文件末尾
_, err = file.Seek(0, io.SeekEnd)
if err != nil {
fmt.Println("Error seeking file:", err)
return
}
// 获取当前文件指针的位置
pos, err := file.Seek(0, io.SeekCurrent)
if err != nil {
io.EOF
Read
方法中作为正常结束信号。io.ErrShortBuffer
io.ErrUnexpectedEOF
EOF
)6**。os.File
、net.Conn
、bytes.Buffer
等类型均实现了 io.Reader
和 io.Writer
接口,可直接用于IO操作。bufio
包bufio.Reader
),优化高频小数据量操作的性能。ioutil
包ReadFile
和 WriteFile
,简化文件读写流程(底层调用 os
和 io
接口)。