深入理解golang中io.Writer接口的使用

 更新时间:2023年10月19日 10:46:04   作者:海生  
io 是一个 Golang 标准库包,它为围绕输入和输出的许多操作和用例定义了灵活的接口,这篇文章主要为大家介绍了Go中Writer接口的使用,需要的可以参考下

一、前言

在很多地方我们会用到 io.Writer,比如下面是我在学习text/templat遇到的

str := "world"
    tmpl, err := template.New("test").Parse("hello, {{.}}\n") //建立一个名字为test的模版"hello, {{.}}"
    if err != nil{
        panic(err)
    }
    err = tmpl.Execute(os.Stdout, str) //将str的值合成到tmpl模版的{{.}}中,并将合成得到的文本输入到os.Stdout,返回hello, world
    if err != nil{
        panic(err)
    }

这里会在控制台上输出。一个 hello world。

其中是这个函数,把模版输出到 io.Writer中,这里是 os.Stdout,就是执行控制台。但当时就想在,如果需要输入到一个变量中怎么办呢,方便其他的函数调用,才发现对io.Writer不理解,不知道变量形式的io.Writer怎么弄。

func (t *Template) Execute(wr io.Writer, data any) error {
    return t.execute(wr, data)
}

二、io.Writer介绍

这里我打开官方的 io.Writer,发现是一个接口,下面是它的注释

// Writer 是一个包含Write()方法的接口.
//
// Write() 写入 len(p) 长度的字节 从 p 到特定类型的字节流里
// Write()返回一个写入的字节长度,以及一个错误
// Write() 必须返回一个err,当len(p)<0的时候
// Write() 不能修改 p的数据。
//
// Implementations must not retain p.
type Writer interface {
    Write(p []byte) (n int, err error)
}

】

io.Writer 会从 buf 中获取数据,然后再复制到底层数据流中,这里的底层数据流可能是文件、buffer或者网络响应。

看了上面的我们大约了解是一个 封装了Write()方法的一个接口。在开发中,常见的实现了io.Writer的接口,常见类型有啥呢?

三、常用的几种io.Writer实现

1、写入到内存中,bytes.Buffer

func TestBytes(t *testing.T) {
    buf := new(bytes.Buffer)
    // 写入到buf
    buf.Write([]byte("hello"))
    t.Log(buf.String())
    //输出hello
}

2、写入界面输出中,os.Stdout

func TestOsStdout(t *testing.T) {
    _, _ = os.Stdout.Write([]byte("hello"))
    // 输出hello
    // 和fmt.Println()打印一样,就是打印到控制台,
}

3、写入文件中

func TestFile(t *testing.T) {
    f, err := os.Create("hi.txt")
    defer f.Close()
    if err != nil {
        t.Fatal(err)
    }
    f.Write([]byte("hello"))
}

会发现,同目录下增加了一个 hi.txt,里面内容是hello

4、写入到自定义结构化数据中,这里用json

type Person struct {
    Name string
    Age  int64
}

func (p *Person) Write(b []byte) (n int, err error) {
    err = json.Unmarshal(b, p)
    return 1, err
}

func TestStruct(t *testing.T) {
    p := &Person{}
    p.Write([]byte("{\n\"name\":\"hisheng\",\n\"age\":11\n}"))
    t.Log(p.Name)
}

这里会输出hisheng

到此这篇关于深入理解golang中io.Writer接口的使用的文章就介绍到这了,更多相关go io.Writer接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang 微服务之gRPC与Protobuf的使用

    golang 微服务之gRPC与Protobuf的使用

    这篇文章主要介绍了golang 微服务之gRPC与Protobuf的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 关于go get 下载第三方包存储路径问题

    关于go get 下载第三方包存储路径问题

    这篇文章主要介绍了关于go get 下载第三方包存储路径问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • golang 跳出for循环操作

    golang 跳出for循环操作

    这篇文章主要介绍了golang 跳出for循环操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang交叉编译之跨平台编译使用详解

    Golang交叉编译之跨平台编译使用详解

    这篇文章主要为大家介绍了Golang交叉编译之跨平台编译使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • GO语言Context的作用及各种使用方法

    GO语言Context的作用及各种使用方法

    golang的Context包是专门用来处理多个goroutine之间与请求域的数据、取消信号、截止时间等相关操作,下面这篇文章主要给大家介绍了关于GO语言Context的作用及各种使用方法的相关资料,需要的朋友可以参考下
    2024-01-01
  • 如何避免go的map竞态问题的方法

    如何避免go的map竞态问题的方法

    本文主要介绍了如何避免go的map竞态问题的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Go Gin框架中的路由组及其优先级探索分析

    Go Gin框架中的路由组及其优先级探索分析

    在构建Web应用程序时,理解和有效地使用路由是至关重要的,Go语言的Gin框架为此提供了强大的工具,特别是通过其路由组功能,本文将深入探讨Gin的RouterGroup,特别是在路径匹配和优先级方面的行为
    2024-01-01
  • Go变量作用域代码实战详解

    Go变量作用域代码实战详解

    Go语言提供了几种不同的作用域类型,使得开发者可以灵活地控制变量的可见范围和生命周期,本章节将详细概述Go语言中变量的各种作用域,帮助读者更好地理解和应用这些概念,需要的朋友可以参考下
    2024-06-06
  • Go语言使用钉钉机器人推送消息的实现示例

    Go语言使用钉钉机器人推送消息的实现示例

    本文主要介绍了Go语言使用钉钉机器人推送消息的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • OpenTelemetry-go的SDK使用方法详解

    OpenTelemetry-go的SDK使用方法详解

    这篇文章主要介绍了OpenTelemetry-go的SDK使用方法,OpenTelemetry帮我们实现了相应语言的SDK,所以我们只需要进行调用即可,本文根据官方文档实例讲解,需要的朋友可以参考下
    2022-09-09

最新评论