深入理解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接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go基础系列:Go切片(分片)slice详解

    Go基础系列:Go切片(分片)slice详解

    这篇文章主要介绍了Go语言中的切片(分片)slice详细说明 ,需要的朋友可以参考下
    2022-04-04
  • golang DNS服务器的简单实现操作

    golang DNS服务器的简单实现操作

    这篇文章主要介绍了golang DNS服务器的简单实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • GO中的时间操作总结(time&dateparse)

    GO中的时间操作总结(time&dateparse)

    日常开发过程中,对于时间的操作可谓是无处不在,但是想实现时间自由还是不简单的,多种时间格式容易混淆,本文为大家整理了一下GO中的时间操作,有需要的可以参考下
    2023-09-09
  • 一文教你如何用好GO语言变长参数

    一文教你如何用好GO语言变长参数

    对于函数重载相信编码过的 xdm 肯定不会陌生,那么我们一起分别来看看 C 语言,C++ 语言,GO 语言 如何去模拟和使用重载,感兴趣的可以学习一下
    2023-09-09
  • Go 简单实现多租户数据库隔离

    Go 简单实现多租户数据库隔离

    本文主要介绍了Go 简单实现多租户数据库隔离,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Go uuid库的具体使用

    Go uuid库的具体使用

    在现代软件开发中,全球唯一标识符(UUID)在许多场景中发挥着重要的作用,本文主要介绍了Go uuid库的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Go Run, Go Build, Go Install的区别

    Go Run, Go Build, Go Install的区别

    本文深入探讨Go语言中gorun、gobuild和goinstall三个常用命令的功能区别和适用场景,文中通过具体代码示例,详细解释了各命令的使用方式及其应用场景,帮助开发者高效利用这些工具
    2024-10-10
  • Go语言omitempty选项的实现

    Go语言omitempty选项的实现

    本文主要介绍了Go语言omitempty选项的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • go语言阻塞函数和非阻塞函数实现

    go语言阻塞函数和非阻塞函数实现

    本文主要介绍了go语言阻塞函数和非阻塞函数实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • golang爬虫colly 发送post请求

    golang爬虫colly 发送post请求

    本文主要介绍了golang爬虫colly 发送post请求实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07

最新评论