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

使用例子如下:

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>
}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值