深入理解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实现数组分割的示例代码,要求把数组分割成多个正整数大小的数组,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • GoLang内存模型详细讲解

    GoLang内存模型详细讲解

    go官方介绍go内存模型的时候说:探究在什么条件下,goroutine 在读取一个变量的值的时,能够看到其它 goroutine 对这个变量进行的写的结果,Go内存模型规定了一些条件,在这些条件下,在一个goroutine中读取变量返回的值能够确保是另一个goroutine中对该变量写入的值
    2022-12-12
  • Go语言中基本数据类型的相互转换详解

    Go语言中基本数据类型的相互转换详解

    Go在不同类型的变量之间赋值时需要显示转换,不能自动转换。这篇文章主要和大家介绍了Go语言中基本数据类型的相互转换,感兴趣的小伙伴可以了解一下
    2022-10-10
  • golang中defer的关键特性示例详解

    golang中defer的关键特性示例详解

    defer是golang语言中的关键字,用于资源的释放,会在函数返回之前进行调用。下面这篇文章主要给大家介绍了关于golang中defer的关键特性,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-08-08
  • 简单对比一下 C语言 与 Go语言

    简单对比一下 C语言 与 Go语言

    这篇文章主要介绍了简单对比一下 C语言 与 Go语言的相关资料,需要的朋友可以参考下
    2023-08-08
  • goland 设置project gopath的操作

    goland 设置project gopath的操作

    这篇文章主要介绍了goland 设置project gopath的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go1.18新特性使用Generics泛型进行流式处理

    Go1.18新特性使用Generics泛型进行流式处理

    这篇文章主要为大家介绍了Go1.18新特性使用Generics泛型进行流式处理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • golang pprof 监控系列 go trace统计原理与使用解析

    golang pprof 监控系列 go trace统计原理与使用解析

    这篇文章主要为大家介绍了golang pprof 监控系列 go trace统计原理与使用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 从零封装Gin框架实现数据库初始化GORM

    从零封装Gin框架实现数据库初始化GORM

    这篇文章主要为大家介绍了从零封装Gin框架实现数据库初始化GORM,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • golang复制文件夹移动到另一个文件夹实现方法详解

    golang复制文件夹移动到另一个文件夹实现方法详解

    这篇文章主要为大家介绍了golang复制文件夹并移动到另一个文件夹实现方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论