码迷,mamicode.com
首页 > 其他好文 > 详细

Go IO

时间:2019-01-05 18:21:38      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:接口   http   data   www   defer   struct   ring   int   txt   

  • IO包 是对数据流的操作。从哪里来, 怎么处理,再到哪里去。
    技术分享图片

技术分享图片

图片来源 https://medium.com/learning-the-go-programming-language/streaming-io-in-go-d93507931185

  • IO包 对数据的读写 是通过接口的形式约定的。数据的来源或者去向可能是 网络,内存,文件。
type Reader interface {
     Read(p []byte) (n int, err error)
}

type Writer interface {
    Write(p []byte) (n int, err error)
}
  • 应用层 只需要按照接口去调用接口 不用关心底层实现细节 非常方便
package main

import (
    "io"
    "net/http"
    "os"
    "strings"
)

type R struct {
    reader io.Reader
}

func NewReader(r io.Reader) *R {
    return &R{
        reader: r,
    }
}

func (r *R) Read(p []byte) (n int, err error) {
    if _, err = r.reader.Read(p); err != nil {
        return
    }
    return len(p), nil
}

func main() {
    netR, err := http.Get("https://www.bilibili.com/")
    if err != nil {
        panic(err)
    }
    defer netR.Body.Close()
    fileR, err := os.Open("/tmp/data.txt")
    if err != nil {
        panic(err)
    }
    //读内存
    r1 := NewReader(strings.NewReader(""))
    b := make([]byte, 10*1024)
    if _, err := r1.Read(b); err != nil {
        panic(err)
    }
    //读网络
    r2 := NewReader(netR.Body)
    if _, err := r2.Read(b); err != nil {
        panic(err)
    }
    //读文件
    r3 := NewReader(fileR)
    if _, err := r3.Read(b); err != nil {
        panic(err)
    }
}

Go IO

标签:接口   http   data   www   defer   struct   ring   int   txt   

原文地址:https://www.cnblogs.com/alin-qu/p/10225268.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!