Go中各种newreader和newbuffer的使用总结

 更新时间:2023年11月21日 09:54:47   作者:绛洞花主敏明  
这篇文章主要为大家详细介绍了Go语言中各种newreader和newbuffer的使用的相关资料,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解下

一、bytes.NewBuffer和bytes.NewReader

func main() {
    var byteArr []byte
    buf := bytes.NewBuffer(byteArr)
    buf.Write([]byte("今天不错"))
 
    fmt.Println(buf.String())
}
package main
 
import (
    "bytes"
    "fmt"
)
 
func main() {
    data := []byte("路多辛的所思所想")
    reader := bytes.NewReader(data)
 
    // 读取整个字节数组
    buf := make([]byte, len(data))
    _, err := reader.Read(buf)
    if err != nil {
        fmt.Println("Read failed:", err)
    }
    fmt.Println("Bytes read:", buf)
 
    // 读取字节切片的一部分
    part := make([]byte, 3)
    _, err = reader.Read(part)
    if err != nil {
        fmt.Println("Read failed:", err)
    }
    fmt.Println("Bytes read:", part)
 
    // 查找并读取字节切片中的某个字符
    offset, err := reader.Seek(6, 0)
    if err != nil {
        fmt.Println("Seek failed:", err)
    }
    ch, size, err := reader.ReadRune()
    if err != nil {
        fmt.Println("ReadRune failed:", err)
    }
    fmt.Printf("Read %c with size %d at offset %d\n", ch, size, offset)
}

二、strings.NewReader(没有newWriter)

    r := strings.NewReader("abcdefghijklmn")
    fmt.Println(r.Len())   // 输出14  初始时,未读长度等于字符串长度
    var buf []byte
    buf = make([]byte, 5)
    readLen, err := r.Read(buf)
    fmt.Println("读取到的长度:", readLen) //读取到的长度5
    if err != nil {
        fmt.Println("错误:", err)
    }
    fmt.Println(buf)            //adcde
    fmt.Println(r.Len())        //9   读取到了5个 剩余未读是14-5
    fmt.Println(r.Size())       //14   字符串的长度

三、bufio.NewReader和bufio.NewWriter

package main
import (
    "fmt"
    "io"
    "os"
)
func main() {
    fmt.Println("嗨客网(www.haicoder.net)")
    fileName := "C:/haicoder.txt"
    file, err := os.Open(fileName)
    if err != nil{
        fmt.Println("Read file err, err =", err)
        return
    }
    defer file.Close()
    var chunk []byte
    buf := make([]byte, 1024)
    for{
        n, err := bufio.NewReader(buf)
        if err != nil && err != io.EOF{
            fmt.Println("read buf fail", err)
            return
        }
        //说明读取结束
        if n == 0 {
            break
        }
        //读取到最终的缓冲区中
        chunk = append(chunk, buf[:n]...)
    }
    fmt.Println("File Content =", string(chunk))
}
package main
import (
    "bufio"
    "fmt"
    "io/ioutil"
    "os"
)
func main() {
    fmt.Println("嗨客网(www.haicoder.net)")
    var(
        fileName = "C:/haicoder.txt"
        content = "Hello HaiCoder"
        file *os.File
        err error
    )
    //使用追加模式打开文件
    file, err = os.OpenFile(fileName, os.O_APPEND, 0666)
    if err != nil{
        fmt.Println("Open file err =", err)
        return
    }
    defer file.Close()
    writer := bufio.NewWriter(file)
    //写入文件
    n, err := writer.Write([]byte(content))
    if err != nil{
        fmt.Println("Write file err =", err)
        return
    }
    fmt.Println("Write file success, n =", n)
    writer.Flush()
    //读取文件
    fileContent, err := ioutil.ReadFile(fileName)
    if err != nil{
        fmt.Println("Read file err =", err)
        return
    }
    fmt.Println("Read file success =", string(fileContent))
}

总结:

1、使用的newbuffer,缓存区是用来存储内容的,并不能确定具体需要的内存大小,因此newbuffer的参数为不固定的[]byte{};

2、使用的newreader,缓存区应该是有数值的,此时是用来读取其中的内容。

到此这篇关于Go中各种newreader和newbuffer的使用总结的文章就介绍到这了,更多相关Go reader buffer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅析Go语言中的逃逸分析

    浅析Go语言中的逃逸分析

    逃逸分析算是go语言的特色之一,所以这篇文章小编就来和大家聊聊为什么不应该过度关注go语言的逃逸分析,感兴趣的小伙伴可以跟随小编一起了解一下
    2024-10-10
  • 如何通过go自定义一个分页插件

    如何通过go自定义一个分页插件

    分页是我们日常开发中经常会遇到的一个需求,下面这篇文章主要给大家介绍了关于如何通过go自定义一个分页插件的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • Go标准库http与fasthttp服务端性能对比场景分析

    Go标准库http与fasthttp服务端性能对比场景分析

    这篇文章主要介绍了Go标准库http与fasthttp服务端性能比较,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Go定时器的三种实现方式示例详解

    Go定时器的三种实现方式示例详解

    这篇文章主要为大家介绍了Go定时器的三种实现方式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 使用client go实现自定义控制器的方法

    使用client go实现自定义控制器的方法

    本文我们来使用client-go实现一个自定义控制器,通过判断service的Annotations属性是否包含ingress/http,如果包含则创建ingress,如果不包含则不创建,对client go自定义控制器相关知识感兴趣的朋友一起看看吧
    2022-05-05
  • 详解如何在Golang中监听多个channel

    详解如何在Golang中监听多个channel

    这篇文章主要为大家详细介绍了如何在Golang中实现监听多个channel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • 瞅一眼就能学会的GO并发编程使用教程

    瞅一眼就能学会的GO并发编程使用教程

    随着互联网的普及,互联网用户人数原来越多,这对系统的性能带来了巨大的挑战。这个时候就需要并发编程了,本文为大家整理了详细的GO并发编程使用教程,让你看完就能学会
    2023-02-02
  • Go实现凯撒密码加密解密

    Go实现凯撒密码加密解密

    这篇文章主要为大家介绍了Go实现凯撒密码加密解密示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 轻松入门:使用Golang开发跨平台GUI应用

    轻松入门:使用Golang开发跨平台GUI应用

    Golang是一种强大的编程语言,它的并发性和高性能使其成为开发GUI桌面应用的理想选择,Golang提供了丰富的标准库和第三方库,可以轻松地创建跨平台的GUI应用程序,通过使用Golang的GUI库,开发人员可以快速构建具有丰富用户界面和交互功能的应用程序,需要的朋友可以参考下
    2023-10-10
  • 关于golang struct 中的 slice 无法原子赋值的问题

    关于golang struct 中的 slice 无法原子赋值的问题

    这篇文章主要介绍了为什么 golang struct 中的 slice 无法原子赋值的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01

最新评论