您的位置:首页 > 编程语言 > Go语言

go语言 自定义类型的时候ReadFull如何使用

2017-06-29 14:16 381 查看
使用例子如下:

Go 语言中的接口很简单,在 Go 语言的 io 包中有这样一个函数:

func ReadFull(r Reader, buf []byte) (n int, err error)

  这个函数可以把对象 r 中的数据读出来,然后存入一个缓冲区 buf 中,以便其它代码可以处理 buf 中的数据。

  这里有个问题,ReadFull 函数究竟可以读取哪些对象的数据?可以读文件中的数据吗?可以读网络中的数据吗?可以读数据库中的数据吗?可以读磁盘中的扇区吗?可以读内存中的数据吗?

  答案是 ReadFull 可以读取任何对象的数据,但是有个前提,就是这个对象必须符合 Reader 的标准。

  Reader 的标准是什么呢?下面是 Reader 的定义:

type Reader interface {
    Read(p []byte) (n int, err error)
}

  从上面的定义可以看出,Reader 的标准很简单,只要某个对象实现了 Read 方法,这个对象就符合了 Reader 的标准,就可以被 ReadFull 读取。

  太简单了,只需要实现 Read 方法,不需要做其它任何事情。下面我们就来定义一个自己的类型,然后实现 Read 方法:


package main

import (
"fmt"
"io"
)

// 定义一个 Ustr 类型
type Ustr struct {
s string // 数据流
i int // 读写位置
}

// 根据字符串创建 Ustr 对象
func NewUstr(s string) *Ustr {
return &Ustr{s, 0}
}

// 获取未读取部分的数据长度
func (s *Ustr) Len() int {
return len(s.s) - s.i
}

// 实现 Ustr 类型的 Read 方法
func (s *Ustr) Read(p []byte) (n int, err error) {
for ; s.i < len(s.s) && n < len(p); s.i++ {
c := s.s[s.i]
// 将小写字母转换为大写字母,然后写入 p 中
if 'a' <= c && c <= 'z' {
p
= c + 'A' - 'a'
} else {
p
= c
}
n++
}
// 根据读取的字节数设置返回值
if n == 0 {
return n, io.EOF
}
return n, nil
}

func main() {
s := NewUstr("Hello World!") // 创建 Ustr 对象 s
buf := make([]byte, s.Len()) // 创建缓冲区 buf

n, err := io.ReadFull(s, buf) // 将 s 中的数据读取到 buf 中

fmt.Printf("%s\n", buf) // HELLO WORLD!
fmt.Println(n, err) // 12 <nil>
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: