前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang-101-hacks(24)——Decorate types to implement io.Reader interface

golang-101-hacks(24)——Decorate types to implement io.Reader interface

作者头像
羊羽shine
发布2019-07-01 11:27:41
6940
发布2019-07-01 11:27:41
举报
文章被收录于专栏:Golang开发Golang开发

注:本文是对golang-101-hacks中文翻译

io包提供了一组便捷的读取函数和方法,但同时都需要参数满足io.Reader接口。请看下面的例子:

代码语言:javascript
复制
package main

import (
    "fmt"
    "io"
)

func main() {
    s := "Hello, world!"
    p := make([]byte, len(s))
    if _, err := io.ReadFull(s, p); err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("%s\n", p)
    }
} 

编译程序,会发生如下错误: Compile above program and an error is generated:

代码语言:javascript
复制
read.go:11: cannot use s (type string) as type io.Reader in argument to io.ReadFull:
    string does not implement io.Reader (missing Read method)

io.ReadFull函数要求参数应该实现了' io.Reader ',但' string '类型没有Read()方法,所以需要对' s '变量做转换。将io.ReadFull(s, p)转换为io.ReadFull(strings.NewReader(s), p)

代码语言:javascript
复制
package main

import (
    "fmt"
    "io"
    "strings"
)

func main() {
    s := "Hello, world!"
    p := make([]byte, len(s))
    if _, err := io.ReadFull(strings.NewReader(s), p); err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("%s\n", p)
    }
}

这次编译成功 运行结果如下

代码语言:javascript
复制
Hello, world!

strings.NewReader函数可以将字符串转换成strings.Reader

代码语言:javascript
复制
func (r *Reader) Read(b []byte) (n int, err error)  

Besides string, another common operation is to use bytes.NewReader to convert a byte slice into a bytes.Reader struct which satisfies io.Reader interface. Do some modifications on the above example:

代码语言:javascript
复制
 package main

import (
    "bytes"
    "fmt"
    "io"
    "strings"
)

func main() {
    s := "Hello, world!"
    p := make([]byte, len(s))
    if _, err := io.ReadFull(strings.NewReader(s), p); err != nil {
        fmt.Println(err)
    }

    r := bytes.NewReader(p)
    if b, err := r.ReadByte(); err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("%c\n", b)
    }
}

bytes.NewReaderp切片转换为bytes.Reader结构。输出结果如下:

代码语言:javascript
复制
H
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.06.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档