关闭

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

标签: goreadfullgo语言
544人阅读 评论(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
查看评论

Go语言的beego框架中的orm中的Read函数使用

在官方文档上beego的Read函数o := orm.NewOrm() user := User{Id: 1}err = o.Read(&user)if err == orm.ErrNoRows { fmt.Println("查询不到") } else if er...
  • shengzhu1
  • shengzhu1
  • 2016-12-06 16:02
  • 942

Go语言实战_自定义集合Set

Go语言实战——自定义集合Set 在Go语言中有作为Hash Table实现的字典(Map)类型,但标准数据类型中并没有集合(Set)这种数据类型,本篇主要实现自定义集合Set。
  • u012855229
  • u012855229
  • 2016-07-31 07:43
  • 1450

Go语言核心之美 1.3-赋值及类型声明篇

四、赋值(Assignment) 变量的值可以通过赋值操作来更新, v = 10。x = 1 // 具名变量x *p = true // 指针变量 person.name = "bob" ...
  • abv123456789
  • abv123456789
  • 2016-03-15 13:16
  • 2356

C++之创建自定义类型的数组---补充(17)《Effective C++》

C++中创建自定义类型的数组的方式有三种,我们分别进行表述:1、使用new运算符直接在堆中创建://使用A的默认构造函数,然后对其进行赋值操作 A* a=new A[size]; A* a=new A[size]();a[0]=A(); a[1]=A(arguments); ...2、使用new运算...
  • u014038273
  • u014038273
  • 2017-08-30 18:13
  • 240

go语言自定义包

go语言自定义包包是函数和数据的集合。用 package 关键字定义一个包。文件名不需要与包名 一致,但是你的文件夹必须要与包名字一致,这个很重要,所以为了简单起见,名字都是一样的。包名的约定是使用小写字符。Go 包可以由多个文件组成,但是使用相同的 package 这一行。让我们在文件 pa...
  • guoer9973
  • guoer9973
  • 2015-03-05 16:52
  • 3000

Golang:无惧makefile

女主宣言 目前发现项目中的好多小伙伴在编写go程序的时候,基本都是使用命令行来执行“go build”、“go test”这些命令。但是发现很是麻烦而且效率不高,所以今天小编将本文带给大家,希望能够帮助大家提高效率。 PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦...
  • ZVAyIVqt0UFji
  • ZVAyIVqt0UFji
  • 2017-09-26 00:00
  • 199

GO语言依赖管理工具govendor的使用

GO语言依赖管理工具govendor的使用
  • h363659487
  • h363659487
  • 2017-11-28 09:25
  • 418

六、go语言一些常用方法--go语言笔记

遍历以及mapfor i,value range slice{}//方式一 ages:=make(map[string]int)//方式二 ages:=map[string]int{ “alice”:31, “charlies”:34, } //delete 一个元素 dele...
  • alvine008
  • alvine008
  • 2016-04-05 13:41
  • 972

15、C语言用户自定义数据类型

C语言用户自定义数据类型 一、结构体 定义语法: struct [名称] { 成员列表; }[变量列表]; 示例程序: #include #include struct Student { int age; char *name; c...
  • xuxianmei
  • xuxianmei
  • 2013-06-06 18:14
  • 1321

go语言之脚本命令的使用

比如说我想在go项目启动的时候,也把java项目启动,那么我就可以把启动java项目的脚本命令放入到go项目中 go语言也为我们提供了执行脚本命令的包 “os/exec” 1.引入 "os/exec"包 2.在go项目main函数中执行 c := "jav...
  • qq_29447481
  • qq_29447481
  • 2017-06-19 14:17
  • 460
    个人资料
    • 访问:368321次
    • 积分:6976
    • 等级:
    • 排名:第3930名
    • 原创:317篇
    • 转载:44篇
    • 译文:0篇
    • 评论:62条
    博客专栏
    最新评论