golang讲解(go语言)标准库分析之io(2)

今天我们继续讲golang的io的标准库

[1]type PipeReader

  1. type PipeReader struct {
  2. // contains filtered or unexported fields
  3. }
(1)func Pipe() (PipeReader, PipeWriter)创建一个管道,并返回它的读取器和写入器,这个会在内存中进行管道同步,它的开启会io.Reader然后等待io.Writer的输入,没有内部缓冲,它是安全的调用Read和Write彼此和并行调用写
  1. import (
  2. "fmt"
  3. "io"
  4. "reflect"
  5. )
  6. func main() {
  7. r, w := io.Pipe()
  8. fmt.Println(reflect.TypeOf(r)) //*io.PipeReader
  9. fmt.Println(reflect.TypeOf(w)) //*io.PipeWriter
  10. }

(2)func (r *PipeReader) Close() error管道关闭后,正在进行或后续的写入Write操作返回ErrClosedPipe
  1. import (
  2. "fmt"
  3. "io"
  4. )
  5. func main() {
  6. r, w := io.Pipe()
  7. r.Close()
  8. _, err := w.Write([]byte("hello widuu")) //具体可以看下边的func (w *PipeWriter) Write(data []byte) (n int, err error),当然也就这样用用的了,它是阻塞的后边具体介绍
  9. if err == io.ErrClosedPipe {
  10. fmt.Println("管道已经关闭无法写入") //管道已经关闭无法写入
  11. }
  12. }

(3)func (r *PipeReader) CloseWithError(err error) error这个就是上边的r.Close关闭的时候,写入器会返回错误的信息
  1. import (
  2. "errors"
  3. "fmt"
  4. "io"
  5. )
  6. func main() {
  7. r, w := io.Pipe()
  8. r.Close()
  9. err := errors.New("管道符关闭了") //errors这个包我们前边已经说过了,就一个方法New不会的可以看看前边的
  10. r.CloseWithError(err)
  11. _, err = w.Write([]byte("test"))
  12. if err != nil {
  13. fmt.Println(err) //管道符关闭了
  14. }
  15. }

(4)func (r *PipeReader) Read(data []byte) (n int, err error)标准的阅读接口,它从管道中读取数据、阻塞一直到一个写入接口关闭,如果写入端发生错误,它就会返回错误,否则返回的EOF
  1. import (
  2. "fmt"
  3. "io"
  4. )
  5. func main() {
  6. r, w := io.Pipe()
  7. go w.Write([]byte("hello widuu"))
  8. d := make([]byte, 11)
  9. n, _ := r.Read(d) //从管道里读取数据
  10. fmt.Println(string(d))
  11. fmt.Println(n)
  12. }

[2]type PipeWriter

  1. type PipeWriter struct {
  2. // contains filtered or unexported fields
  3. }
(1)func (w *PipeWriter) Close() error关闭管道,关闭时正在进行的Read操作将返回EOF,若管道内仍有未读取的数据,后续仍可正常读取
  1. import (
  2. "fmt"
  3. "io"
  4. )
  5. func main() {
  6. r, w := io.Pipe()
  7. go w.Write([]byte("hello word"))
  8. data := make([]byte, 10)
  9. n, err := r.Read(data)
  10. w.Close()
  11. if err == io.EOF {
  12. fmt.Println("executing read return EOF")
  13. fmt.Println("executing read reads number", n)
  14. }
  15. n, _ = r.Read(data)
  16. fmt.Println(string(data)) //hello word
  17. fmt.Println("next read number", n) //next read number 0
  18. }

(2)func (w *PipeWriter) CloseWithError(err error) error这个函数和read里边的CloseWithError是大同小异的,关闭管道,关闭时正在进行的Read操作将返回参数传入的异常,若管道内仍有未读取的数据,后续仍可正常读取
  1. import (
  2. "errors"
  3. "fmt"
  4. "io"
  5. )
  6. func main() {
  7. r, w := io.Pipe()
  8. go w.Write([]byte("hello widuu"))
  9. newerr := errors.New("your daye 突然关闭了")
  10. w.CloseWithError(newerr)
  11. data := make([]byte, 10)
  12. _, err := r.Read(data)
  13. if err != nil {
  14. fmt.Println(err) //your daye 突然关闭了
  15. }
  16. }

(3)func (w *PipeWriter) Write(data []byte) (n int, err error)终于来打write了,这个是把字节切片写入管道,返回的是写入字节数和error,前边用到的太多了,随便哪一个吧
  1. import (
  2. "fmt"
  3. "io"
  4. )
  5. func main() {
  6. r, w := io.Pipe()
  7. go w.Write([]byte("hello widuu")) //写入的是[]byte,注意官方文档写的是,写入管道阻塞,一直到所有数据的读取结束
  8. data := make([]byte, 11)
  9. n, _ := r.Read(data)
  10. fmt.Println(string(data)) //hello widuu
  11. fmt.Println("read number", n) //read number 10
  12. }

每天只讲一点golang的标准库,方便大家学习和使用,更多的时候去理解标准库,大家多动手,如果你喜欢请继续关注我们微度网络-网络技术支持中心http://www.widuu.com