go io.readfull 理解

在 Go 语言中, io包为 I/O 原语提供基本接口。它的主要工作是封装这种原语之王的持续实现。 Go 语言中的ReadFull()函数用于从指定的读取器“r”读取到指定的缓冲区“buf”,并且复制的字节恰好等于指定缓冲区的长度。而且,这个函数是在io包下定义的。在这里,您需要导入“io”包才能使用这些功能。

句法:

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

这里,“r”是读取器声明,“buf”是指定长度的缓冲区声明。

返回值:返回指定缓冲区复制的字节数,如果读取的字节数小于指定缓冲区的长度,则返回错误。这里,当且仅当错误为零时,返回的“n”将等于指定的缓冲区的长度。但是,当且仅当没有读取字节时,返回的错误是“EOF”。

注意:如果在读取较少字节但不是所有字节后发生 EOF,则此方法返回ErrUnexpectedEOF错误。但是,如果指定的读取器在读取至少长度的缓冲区后返回错误,则拒绝该错误。

示例代码:

// Golang program to illustrate the usage of
// io.ReadFull() function

// Including main package
package main

// Importing fmt, io, and strings
import (
	"fmt"
	"io"
	"strings"
)

// Calling main
func main() {

	// Defining reader using NewReader method
	reader := strings.NewReader("Geeks")

	// Defining buffer of specified length
	// using make keyword
	buffer := make([]byte, 4)

	// Calling ReadFull method with its parameters
	n, err := io.ReadFull(reader, buffer)

	// If error is not nil then panics
	if err != nil {
		panic(err)
	}

	// Prints output
	fmt.Printf("Number of bytes in the buffer: %d\n", n)
	fmt.Printf("Content in buffer: %s\n", buffer)
	//此时只剩s没有读取,即大小为1,当设置大于1时报错:panic: unexpected EOF
	buffer2 := make([]byte, 1)
	n, err = io.ReadFull(reader, buffer2)
	// If error is not nil then panics
	if err != nil {
		panic(err)
	}

	// Prints output
	fmt.Printf("Number of bytes in the buffer: %d\n", n)
	fmt.Printf("Content in buffer: %s\n", buffer2)

}


可以理解为当进行readfull读取reader数据时,reader中有一个隐形指针指向最后读到数据的后一位,当下一次进行readfull时从当前指针的位置进行读取,即前一次读取的数据不再进行读取,直接略过

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值