Golang io 标准库使用分析

发布于:2024-10-24 编辑:匿名 来源:网络

前言 io 包提供了 I/O(输入输出,即输入输出)原语的基本接口。它的基本任务是包装这些原语的现有实现(例如 中的 os 包原语),使其成为共享的公共接口。

例如,Go语言标准库strings、bytes、bufio、os中,都有实现io.Reader的类型。本篇文章我们将通过IO库定义的接口一步步加深理解。

对于io库定义的接口,首先看IO库的代码,src/io/io.go。这里是所有io接口、基本接口和组合接口的定义。

不过请注意,这只是定义了接口语义,并不涉及接口的具体实现,我们会根据日常遇到的情况列出一些场景。这里我大致了解了这些接口之间的关系,如下图: io库接口定义图中的Reader、Writer、Closer、Seeker接口是基本接口,但是组合类型接口中的ReadWriter是在这些的基础上组合而成的匿名,然后还有一些独立的接口,比如ReaderFrom。

我们先来看看读者。 Reader 是一个包装了基本 Read 方法的接口。

Read 最多可以将 len (p) 个字节读入 p 中。它返回读取的字节数 (0<=n<=len (p)) 和遇到的任何错误。

代码语言:javascript copy type Reader 接口 { Read(p []byte) (n int, err error)}Writer 是一个包装了基本 Write 方法的接口。 Write 将 p 中的 len (p) 个字节写入底层数据流。

它返回从 p (0<=n<=len(p)) 写入的字节数,以及遇到的导致写入提前停止的任何错误。如果 Write 返回 n

bytes 和 bufio 包都有 Wirte 方法的实现。我稍后会发布图片。

我们可以根据列出的结构体来查看IO接口的具体实现方法。代码语言:javascript copy type Writer 接口 { Write(p []byte) (n int, err error)} 例如 ReadWriter 是一个组合类型接口。

它是使用匿名字段的 Reader 和 Writer 接口的组合。如果要实现ReadWriter接口,则必须同时实现Reader和Writer接口的方法。

代码语言:javascript复制类型 ReadWriter 接口 { Reader Writer } io接口的丰富实现。 Go基于io定义了哪些接口实现?你看我总结的图就知道了。

是不是很熟悉?原来字符串、字节、os都有很多。完成。

基于io接口的实现创建内存。 Readerbytes.NewReader 和 strings.NewReader 都可以包裹 []byte 或 string 并返回一个 Reader 代码语言,该代码语言实现了所有与读取相关的接口: javascript copy // bytes package func NewReader(b []byte) * Reader//strings package func NewReader(s string) *Reader在什么场景下使用?比如我们发送一个Post请求,其中body就是我们要发送的数据,是一个io.Reader。

代码语言: javascript copy func ( c *Client) Post(url string, bodyType string, body io.Reader) (resp *Response, err error)//字符串和字节调用 NewReaderhttp.Post(" "text/plain", strings.NewReader("stings test" ))http.Post(" "text/plain", bytes.NewReader([]byte("bytes test"))os.File 读取文件 Go 的 File 文件句柄(File 实际上是一个结构体),File结构体外部实现的接口,如Read、Write、ReadAt、WriteAt等。代码语言:javascript copy type File struct { *file // os Specific}type file struct { pfd poll.FD name string dirinfo *dirInfo // nil 除非正在读取目录 appendMode bool // 是否打开文件进行追加} 我们使用 os.Open 或 os.OpenFile 来获取 File 结构体的指针,然后读取打开文件的内容 例如: 代码。

语言:javascript复制文件,err:= os.Open("1.txt") if err != nil { return } //函数退出时,及时关闭文件句柄 defer file.Close() //Return *Reader reader := bufio.NewReader(file) // 读取换行符后终止 str,err := reader.ReadString('\n') //NewReader 函数 func NewReader(rd io.Reader) *Reader { return NewReaderSize(rd, defaultBufSize)} 是不是感觉很熟悉?来看看代码逻辑,首先获取File句柄。由于 File 实现了 IO.Reader 接口,因此 bufio.NewReader() 可以传递文件句柄并创建缓冲区(默认大小)。

bufio 实现了 ReadString 接口来读取缓冲区内容。 Go总结 io的核心是io库。

如果要实现接口,还是需要多阅读源码注释。除了定义的接口之外,io/ioutil提供的ReadFile和ReadAll函数也非常有用。

Golang io 标准库使用分析

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 杭州将把创业投资引导基金规模从10亿元扩大到30亿元

    杭州将把创业投资引导基金规模从10亿元扩大到30亿元

    据新华社报道,投资界5月26日消息,为深入实施创新驱动发展战略,充分发挥发挥创业投资促进创新创业的积极作用 杭州市发展改革委、市财政局近日决定,规范杭州市创业投资引导基金运作,扩大引导基金规模从10亿元到30亿元。 杭州市发改委、市财政局联合印发的《杭州市创业投资

    06-18

  • 疯狂的NVIDIA

    疯狂的NVIDIA

    如果要评选年度最热门的公司,NVIDIA一定有一席之地。 2019年生成式AI的爆发,使得一种只在消费电子产品中出现的现象在企业级芯片的采购中很少出现:科技行业的每个人都等待数月并花费大量资金。 购买一个你可能看不到真面目的产品,Nvidia H,这是一款可以在训练 AI 过程中显

    06-18

  • 曹操出行完成38亿元B轮融资,这是今年国内网约车领域首笔股权投资,

    曹操出行完成38亿元B轮融资,这是今年国内网约车领域首笔股权投资,

    据投资界(ID:pedaily)9月6日消息,曹操旅游宣布完成38亿元B轮融资。 人民币。 本轮融资不仅是今年以来网约车公司境内首笔股权投资,也是今年以来网约车旅游公司境内单笔金额最大的融资。 吉利控股集团董事长李书福表示,布局大众出行是吉利科技转型战略的关键举措之一。

    06-18

  • 摩根士丹利或因Facebook上市遭调查

    摩根士丹利或因Facebook上市遭调查

    美国金融业监管局负责人表示,摩根士丹利或面临监管机构调查。 据悉,该分析公司上周在Facebook首次公开募股前向其进行了报告。 机构投资者散布负面消息。 金融业监管局主席及其首席执行官理查德凯彻姆今天在一封电子邮件中表示,如果这些指控属实,将导致投资者对金融业监管

    06-18

  • 刚刚,谷歌又被欧盟罚款113亿人民币

    刚刚,谷歌又被欧盟罚款113亿人民币

    雷锋网消息:北京时间3月20日晚,欧盟反垄断领导人玛格丽特维斯塔格召开新闻发布会,正式宣布谷歌将被罚款14.9亿人民币欧元(约16.9亿欧元)。 因谷歌涉嫌垄断在线搜索广告而被罚款 10 亿美元(1 亿元人民币)。 这是谷歌自2008年以来第三次收到欧盟的反垄断罚款。 在这次会议

    06-18

  • 天山股份利润双双下滑,净利润同比下降7.31%至15.16亿元

    天山股份利润双双下滑,净利润同比下降7.31%至15.16亿元

    天山股份(77.SZ)发布年报。 公司实现营业收入86.92亿元,同比下降10.28%,净利润15.16亿元,同比下降7.31%,加权平均净资产收益率14.26%,基本每股收益1元/股。

    06-18

  • 共享电动汽车再次受到资本青睐, “巴歌旅游”宣布完成2500万元A轮融资,

    共享电动汽车再次受到资本青睐, “巴歌旅游”宣布完成2500万元A轮融资,

    据投资界7月18日消息,新能源汽车分时租赁平台“巴歌出行”宣布完成万元A轮融资。 智行创新领投,联想之星跟投。   巴歌旅游CEO孙杨表示,本轮融资将助力其城市扩张和规模化运营,并将其盈利模式快速复制到全国更多城市。    此前,巴歌出行于今年3月获得宝嘉租车1万元天

    06-18

  • 中国联通将率先推出iPhone 4S,中国电信10月开售传闻已破灭

    中国联通将率先推出iPhone 4S,中国电信10月开售传闻已破灭

    10月8日消息,根据业内人士的爆料以及多家投行的预测,苹果刚刚发布的iPhone 4S在中国大陆仍然有其第一家合作伙伴。 首先是中国联通,其次是中国电信。 预计中国电信将晚于中国联通推出CDMA版iPhone 4S。 此前有关中国电信将在10月份销售iPhone 5的传言自然已经破灭。    此

    06-18

  • 麦当劳不再使用一次性餐具,花了两年时间用婴儿奶瓶材料重新设计 - Feel Good每周

    麦当劳不再使用一次性餐具,花了两年时间用婴儿奶瓶材料重新设计 - Feel Good每周

    Feel Good浠嬬粛鑰愬厠鈥滃緟椋庢潵鈥濓紝闆剁⒊鐗╂祦鍥紑鍚汉璞″拰骞筹紝闇?瑕佲?滆湝铚傗?濆棥鍡′袱澹?016骞翠负楹﹀綋鍔宠璁$幆淇濋鍏佛煉hristopher Raeburn锛氭垜瑙佽瘉浜嗕汉浠鍙寔缁椂灏氭?佸害鐨勮浆鍙橈紝鍥炴敹鏉愭枡琚敤鏉ュ埗浣滈珮绔

    06-21

  • 新锐个人护理品牌“Rock Zoo”连续完成两轮千万美元融资,打造年轻一代生活方式品牌

    新锐个人护理品牌“Rock Zoo”连续完成两轮千万美元融资,打造年轻一代生活方式品牌

    新锐个人护理品牌“Rock Zoo”近日完成融资数千万美元A轮和A+轮融资,其中A轮融资由明讯资本领投,源码资本跟投; A+轮融资由创新工场领投,先锋长青、源码资本、清流资本跟投。 本次募集资金将主要用于研发投入、产品拓展、品牌建设、团队储备和扩张。 Rock Zoo于今年1月开设

    06-17

  • 解码乐居机器人:一支年轻的科技创新团队破茧而出

    解码乐居机器人:一支年轻的科技创新团队破茧而出

    在世界机器人大会上,工信部部长苗圩强调“加快机器人产业发展是机器人产业发展的重要方向”制造业高质量发展。 发展过程中面临诸多问题和挑战。 机器人产业关键核心技术有待进一步提升,应用场景和领域有待进一步拓展。 “我国的机器人产业发展到现在,已经有很多多年掌握核

    06-18

  • 滴滴进军俄罗斯市场,鞑靼斯坦成为走出去的第一站

    滴滴进军俄罗斯市场,鞑靼斯坦成为走出去的第一站

    投资界(ID:pedaily)7月28日消息,据共和国投资发展局官网发布的消息鞑靼斯坦共和国,滴滴最近已聘请司机为喀山市提供出行服务做准备。 喀山将成为滴滴进军俄罗斯市场的第一站。 周五,俄罗斯机密信息网络Avito发布了滴滴在喀山招募司机的通知。 。 通知显示,“孔夫子”公

    06-18