go标准库io|Go主题月

简介: io包提供了系统io最基本的封装,可以用来进行文件的读取,写入,复制等功能。不是线程安全的。

io包


简介

io包提供了系统io最基本的封装,可以用来进行文件的读取,写入,复制等功能。不是线程安全的。

思维导图概览

由于思维导图比较大,这边就不放图了,提供两种途径观看

功能


上面思维导图中虽然方法,接口一大堆,但是我们正常用的话用下面的几个函数就可以了,这几个函数也是对io包里的方法进一步封装。

网络异常,图片无法展示
|

复制

func Copy

func Copy(dst Writer, src Reader) (written int64, err error)

这个函数可以进行文件夹的复制功能,dest参数是目标文件,src参数是源文件。可以实现src文件复制到dst文件的功能。返回值written是复制文件的大小

代码示例:

字符串流复制到了系统输出流里,然后输出了复制的数据大小

package main
import (
  "fmt"
  "io"
  "os"
  "strings"
)
func main() {
  src:=strings.NewReader("这是源文件字符串流")
  l,_:=io.Copy(os.Stdout,src)
  fmt.Printf("\n复制的数据大小:%d",l)
}

输出:

这是源文件字符串流
复制的数据大小:27

func CopyBuffer

func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)

CopyBufferCopy相同,区别在于CopyBuffer使用提供的缓冲区,可以自定义缓冲区大小,而不是分配一个临时缓冲区。如果bufnil,则分配一个临时缓冲区(func Copy就是调用了这个函数,然后buf传了nil;如果长度为0,则CopyBuffer会报异常。

代码示例:自定义大小为100字节的缓冲区,然后将字符串流复制到了系统输出流里,然后输出了复制的数据大小

package main
import (
  "fmt"
  "io"
  "os"
  "strings"
)
func main() {
  src:=strings.NewReader("这是源文件字符串流")
  buf:=make([]byte,100)
  l,_:=io.CopyBuffer(os.Stdout,src,buf)
  fmt.Printf("\n复制的数据大小:%d",l)
}

输出:

这是源文件字符串流
复制的数据大小:27

func CopyN

func CopyN(dst Writer, src Reader, n int64) (written int64, err error)

这个函数可以自定义复制的流大小n,底层实现是先调用LimitReader函数,然后将结果作为src再复制到dest上

代码示例:复制7个字节的数据到系统输出流,然后输出已复制的数据大小

package main
import (
  "fmt"
  "io"
  "os"
  "strings"
)
func main() {
  src:=strings.NewReader("this is test!")
  l,_:=io.CopyN(os.Stdout,src,7)
  fmt.Printf("\n复制的数据大小:%d",l)
}

输出:

this is
复制的数据大小:7

读取

func ReadAll

func ReadAll(r Reader) ([]byte, error)

读取r的全部字节,然后返回[]byte示例代码:

package main
import (
  "fmt"
  "io"
  "strings"
)
func main() {
  src:=strings.NewReader("this is test!")
  b,_:=io.ReadAll(src)
  fmt.Printf("读取的字符串:%s",b)
}

输出:

读取的字符串:this is test!

func ReadAtLeast

func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
  • 参数r表示要读取的io流
  • 参数buf是自定义的缓冲区,也是数据接收区
  • 参数min表示最少要读取的字节数

这个函数会根据你传入的buf大小来读取多少数据。比如你传入的buf的大小为4个字节,这个方法就只会从r中读取4个字节的数据

注意:自定义缓冲区buf要大于最小读取字节数min。如果自定义缓冲区小于等于最小读取字节数min,则会发生异常

代码示例:

package main
import (
  "fmt"
  "io"
  "strings"
)
func main() {
  src:=strings.NewReader("this is test!")
  buf:=make([]byte,4)
  l,_:=io.ReadAtLeast(src,buf,2)
  fmt.Printf("读取的数据:%s\n",buf)
  fmt.Printf("读取的字节数:%d",l)
}

输出:

读取的数据:this
读取的字节数:4

func ReadFull

func ReadFull(r Reader, buf []byte) (n int, err error)

这个函数功能和ReadAtLeast函数一样,而且内部就是调用了这个函数,只是ReadAtLeastmin值就是buf的长度。 所以这个函数的功能也是根据你传入的buf大小来读取多少数据。

写入

func WriteString

func WriteString(w Writer, s string) (n int, err error)
  • 参数w是要写入的目标流
  • 参数s是要写入的字符串数据 这个函数的功能是将字符串s写入到w流中,然后返回写入的数据大小n
package main
import (
  "fmt"
  "io"
  "os"
)
func main() {
  l,_:=io.WriteString(os.Stdout,"go test!")
  fmt.Printf("\n写入的数据大小:%d",l)
}

输出:

go test!
写入的数据大小:8

同步管道流

func pipe

func Pipe() (*PipeReader, *PipeWriter)

这个函数提供了一个安全读取流的功能,调用这个函数后,会返回一个写入流,一个读取流当未读取*PipeReader里的数据时,*PipeWriter始终为阻塞状态,而当读取*PipeReader里的数据时,*PipeReader就变为阻塞状态,期间不能往管道里写入数据

也就是说这个是线程安全的方法,在任一时刻,要么只能读取数据,要么只能写入数据。

package main
import (
  "fmt"
  "io"
  "os"
  "time"
)
func main() {
  r, w := io.Pipe()
  go func() {
    io.WriteString(w,"go pip test")
    io.WriteString(w,"\ngo test2")
    // 调用`Close`方法代表数据写入完成,释放写锁
    w.Close()
  }()
  fmt.Println("2秒后开始准备读取数据")
  time.Sleep(2*time.Second)
  io.Copy(os.Stdout, r)
}

输出:

2秒后开始准备读取数据
go pip test
go test2


目录
相关文章
|
12月前
|
JavaScript 前端开发 Java
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
1791 103
|
Rust 安全 算法
Go标准库的新 math/rand
Go标准库的新 math/rand
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
Go 开发者
go-carbon v2.6.0 重大版本更新,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持
271 3
|
网络协议 Linux Go
用 Go 基于 epoll 实现一个最小化的IO库
Go 语言社区中存在多个异步网络框架,如 evio、nbio、gnet 和 netpoll 等。这些框架旨在解决标准库 netpoll 的低效问题,如一个连接占用一个 goroutine 导致的资源浪费。easyio 是一个最小化的 IO 框架,核心代码不超过 500 行,仅实现 Linux 下的 epoll 和 TCP 协议。它通过 Worker Pool、Buffer 等优化提高了性能,并提供了简单的事件处理机制。
221 0
|
JSON Go 开发者
go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。
327 4
|
缓存 监控 前端开发
Go 语言中如何集成 WebSocket 与 Socket.IO,实现高效、灵活的实时通信
本文探讨了在 Go 语言中如何集成 WebSocket 与 Socket.IO,实现高效、灵活的实时通信。首先介绍了 WebSocket 和 Socket.IO 的基本概念及其优势,接着详细讲解了 Go 语言中 WebSocket 的实现方法,以及二者集成的重要意义和具体步骤。文章还讨论了集成过程中需要注意的问题,如协议兼容性、消息格式、并发处理等,并提供了实时聊天、数据监控和在线协作工具等应用案例,最后提出了性能优化策略,包括数据压缩、缓存策略和连接管理优化。旨在帮助开发者更好地理解并应用这些技术。
896 3
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
468 6
|
JSON 安全 网络协议
go语言使用内置函数和标准库
【10月更文挑战第18天】
250 3
|
JSON 监控 安全
go语言选择合适的工具和库
【10月更文挑战第17天】
259 2