关闭

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

标签: goreadfullgo语言
339人阅读 评论(0) 收藏 举报

使用例子如下:

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[n] = c + 'A' - 'a'
    } else {
      p[n] = 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>
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:297309次
    • 积分:5990
    • 等级:
    • 排名:第4678名
    • 原创:296篇
    • 转载:33篇
    • 译文:0篇
    • 评论:58条
    博客专栏
    最新评论