深入理解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如何实现简易的令牌桶算法

    使用Golang如何实现简易的令牌桶算法

    这篇文章主要介绍了使用Golang如何实现简易的令牌桶算法问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • GO接收GET/POST参数及发送GET/POST请求的实例详解

    GO接收GET/POST参数及发送GET/POST请求的实例详解

    这篇文章主要介绍了GO接收GET/POST参数及发送GET/POST请求,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • golang中的io.ReadCloser与ioutil.NopCloser使用

    golang中的io.ReadCloser与ioutil.NopCloser使用

    这篇文章主要介绍了golang中的io.ReadCloser与ioutil.NopCloser使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • golang使用json格式实现增删查改的实现示例

    golang使用json格式实现增删查改的实现示例

    这篇文章主要介绍了golang使用json格式实现增删查改的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Go+Lua解决Redis秒杀中库存与超卖问题

    Go+Lua解决Redis秒杀中库存与超卖问题

    本文主要介绍了Go+Lua解决Redis秒杀中库存与超卖问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Golang定制化zap日志库使用过程分析

    Golang定制化zap日志库使用过程分析

    Zap是我个人比较喜欢的日志库,是uber开源的,有较好的性能,在项目开发中,经常需要把程序运行过程中各种信息记录下来,有了详细的日志有助于问题排查和功能优化,但如何选择和使用性能好功能强大的日志库,这个就需要我们从多角度考虑
    2023-03-03
  • Golang 语言map底层实现原理解析

    Golang 语言map底层实现原理解析

    这篇文章主要介绍了Golang 语言map底层实现原理解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Golang中这些channel用法你了解吗

    Golang中这些channel用法你了解吗

    channel 是GO语言中一种特殊的类型,是连接并发goroutine的管道,这篇文章主要来和大家分享一下关于 nil channel 通道,有缓冲通道,无缓冲通道的常用方法以及巧妙使用的方式,希望对大家有所帮助
    2023-08-08
  • Golang并发编程之main goroutine的创建与调度详解

    Golang并发编程之main goroutine的创建与调度详解

    这篇文章主要为大家详细介绍了Golang并发编程中main goroutine的创建与调度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • 一文带你深入了解Golang中的自旋锁

    一文带你深入了解Golang中的自旋锁

    自旋锁是一种忙等待锁,当一个线程尝试获取一个已经被其它线程持有的锁时,这个线程会持续循环检查锁的状态(即“自旋”) ,直到锁被释放后获得所有权,下面我们就来深入了解下自旋锁的具体操作吧
    2024-01-01

最新评论