Golang——IO操作

news/2024/5/20 18:09:52

        1. 输入输出的底层原理

        终端其实是一个文件(Linux下一切皆文件),相关实例如下:

  • os.Stdin:标准输出的文件实例,类型为*File
  • os.Stdout:标准输入的文件实例,类型为*File
  • os.Stderr:标准错误输出的文件实例,类型为*File

        以文件方式操作终端:

package mainimport ("os"
)func main() {var buf []byteos.Stdin.Read(buf[:])             //从标准输入中读取os.Stdin.WriteString(string(buf)) //写入标准输入
}

        2. 文件操作相关API 

        根据提供的文件名创建新的文件,返回一个文件对象,默认权限0666,任何人可读可写,不可执行,如果文件存在,则会截断它(为空文件),如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错,错误底层类型是*PathError。

func Create(name string) (file *File, err error)

        NewFile使用给出的Unix文件描述符和名称创建一个文件。 

func NewFile(fd uintptr, name string) *File

        只读方式打开一个名称为name文件。

func Open(name string) (file *File, err error)

        打开一个名为name的文件,flag是打开方式,只读或只写,不存在创建等,perm文件权限。 

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)

        在指定位置(相对于文件起始位置),写入byte类型的数据到文件,它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。

func (f *File) WriteAt(b []byte, off int64) (n int, err error)

        向文件中写入string类型的信息到文件。

func (f *File) WriteString(s string) (ret int, err error)

        从f中读取最多len(b)字节数的数据到b。

func (f *File) Read(b []byte) (n int, err error)

        从f的指定位置(相对于文件起始位置),读取len(b)字节数并写入b。

func (f *File) ReadAt(b []byte, off int64) (n int, err error)

       删除name指定的文件或目录。

func Remove(name string) error

 3. 打开和关闭文件

        os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文件。

package mainimport ("log""os"
)func main() {//只读的方式打开文件f, err := os.Open("./main.go")if err != nil {log.Println("open main.go file fail")return}//关闭文件defer f.Close()
}

4. 写文件

package mainimport ("log""os"
)func main() {//可读可写的方式创建一个文件f, err := os.Create("./xx.txt")if err != nil {log.Println("create file fail")return}defer f.Close()for i := 0; i < 5; i++ {f.Write([]byte("ab\n"))f.WriteString("ab\n")}
}

5. 读文件

        文件读取可以用file.Read()和file.ReadAt(),读到文件末尾会返回io.EOF的错误。

package mainimport ("fmt""io""log""os"
)func main() {f, err := os.Open("./xx.txt")if err != nil {log.Println("open file fail")return}defer f.Close()var content []bytefor {var buf [128]byten, err := f.Read(buf[:])if err == io.EOF {//读到文件末尾break}if err != nil {log.Println("Read file fail", err)return}content = append(content, buf[:n]...) //buf[:n]切片被打散传入}fmt.Println(string(content))
}

 “…”的用法:三个点“...”其实是go的一种语法糖(糖衣语法)

● 第一个用法主要是用于函数有多个不定参数的情况,表示为可变参数,可以接受任意个数但相同类型的参数。

● 第二个用法是slice可以被打散进行传递。

 6. 拷贝文件

package mainimport ("io""log""os"
)func main() {f1, err := os.Open("./xx.txt")if err != nil {log.Println("open xx.txt file fail", err)return}defer f1.Close()f2, err := os.Create("./abc.txt")if err != nil {log.Println("create file fail ", err)return}defer f2.Close()for {var buf [128]byten, err := f1.Read(buf[:])if err == io.EOF {log.Println("读取完毕")break}if err != nil {return}f2.Write(buf[:n])}
}

7. bufio

  • bufio包实现了带缓冲区的读写,是对文件读写的封装。
  • bufio缓冲写数据。

  • bufio读数据 ,bufio先把数据读/写到缓冲区,达到某一上限,会刷新到文件中,也可以强制刷新。
package mainimport ("bufio""fmt""io""log""os"
)func wr() {f, err := os.OpenFile("./xxx.txt", os.O_CREATE|os.O_WRONLY, 0664)if err != nil {log.Println("open file fail ", err)return}defer f.Close()//获取writer对象writer := bufio.NewWriter(f)for i := 0; i < 5; i++ {writer.WriteString("hello\n")}//刷新缓冲区,强制写入writer.Flush()
}func rd() {f, err := os.Open("./xxx.txt")if err != nil {log.Println("open file fail")return}defer f.Close()//获取reader对象reader := bufio.NewReader(f)var content []bytefor {line, _, err := reader.ReadLine()if err == io.EOF {log.Println("读取完毕")break}if err != nil {return}content = append(content, line...)}fmt.Println(string(content))
}func main() {wr()rd()
}

8. ioutil工具包

  • 工具包写文件
  • 工具包读文件
package mainimport ("fmt""io/ioutil""log"
)func wr() {err := ioutil.WriteFile("./xxxx.txt", []byte("hello world!"), 0666)if err != nil {log.Println("err")return}
}func rd() {data, err := ioutil.ReadFile("./xxxx.txt")if err != nil {log.Println("err")return}fmt.Println(string(data))
}func main() {wr()rd()
}

9. 例子

        实现cat命令

package mainimport ("bufio""flag""fmt""io""log""os"
)func cat(reader *bufio.Reader) {for {buf, err := reader.ReadBytes('\n') //注意是字符if err == io.EOF {break}fmt.Fprintf(os.Stdout, "%s", string(buf))}
}func main() {flag.Parse()if flag.NArg() == 0 {cat(bufio.NewReader(os.Stdin))} else {for i := 0; i < flag.NArg(); i++ {f, err := os.Open(flag.Arg(i))if err != nil {log.Printf("open file %s fail, err %v\n", flag.Arg(i), err)continue}cat(bufio.NewReader(f))f.Close()}}
}

http://www.mrgr.cn/p/35063282

相关文章

项目冲刺day2

这个作业属于哪个课程 软工4班这个作业要求在哪里 作业要求1.会议1. 照片2. 昨日已完成: 部分完成登录、注册功能。3.今天计划完成的工作 完成登录、注册功能,部分完成用户中心功能4.工作中遇到的困难 对框架不熟悉,出现很多报错。2.燃尽图3.每人的代码签入记录4.适当的项目…

斯坦福大学的在线密码学课程

密码学是保护计算机系统信息不可或缺的工具。在本课程中&#xff0c;您将了解密码系统的内部工作原理&#xff0c;以及如何在实际应用中正确使用它们。课程首先将详细讨论当强大的对手窃听和篡改流量时&#xff0c;拥有共享密钥的双方如何进行安全通信。我们将研究许多已部署的…

musl-libc 安装与调试

musl-libc 官网:http://musl.libc.org1、下载与安装下载源码并解压编译参数./configure [option]... [VAR=VALUE]... option 说明 --help帮助 --prefix=DIR指定安装目录。默认为/usr/local/musl --host=HOST设置目标程序运行的CPU平台 一般不需要设置,除非你想要交叉编译 默…

....comic科学....食用手册....

1.点击链接后&#xff0c;保存漫画至夸克网盘&#xff0c;若是新用户需要用手机注册. 2.在应用商店下载夸克APP. 3.登录APP下载已保存的漫画. 3.1 进入APP点击 夸克网盘 3.2 点击“转存的内容”后&#xff0c;长按 漫画文件夹&#xff0c;点击下载&#xff0c;下载速度400K左…

C++向函数传递对象

C语言中&#xff0c;对象作为函数的参数和返回值的传递方式有 3 种&#xff1a;值传递、指针传递和引用传递。 1. 对象作为函数参数 把实参对象的值复制给形参对象&#xff0c;这种传递是单向的&#xff0c;只从实参到形参。因此&#xff0c;函数对形参值做的改变不会影响到实…

El-table组件实现懒加载

背景 有的时候我们表格的数据不想使用分页组件展示,想要显示所有的数据,但是显示所有数据会导致服务器负荷严重(比如CPU过载),我们可以使用懒加载的形式,此方式利用监听是否滚动到元素底部,如果到元素底部就去请求下一页的数据 原理效果图示例代码 <template><di…

Eigen求解线性方程组

1、线性方程组的应用 线性方程组可以用来解决各种涉及线性关系的问题。以下是一些通常可以用线性方程组来解决的问题&#xff1a; 在实际工程和科学计算中&#xff0c;求解多项式方程的根有着广泛的应用。 在控制系统的设计中&#xff0c;我们经常需要求解特征方程的根来分析…

Stable Diffusion 发型提示词,美学探索

通过使用发型提示词,可以在生成图片时更准确地描述所需的发型特征。这些提示词包括各种发型类型,从卷发到短发,甚至特定的颜色和风格。通过结合正面和负面提示词,可以确保生成的图片符合预期,避免不合适的内容出现,并介绍一些提示词工具来打造个性化的图像描述。 如何使用…

在阿里云服务器中搭建一个 Ghost 博客

Ghost 是一个基于 Node.js 开发的免费开源博客平台,用于简化博客的写作发布等流程。本文介绍如何在阿里云的 Ubuntu 20.04 操作系统的轻量应用服务器上部署 Ghost 博客(在其他服务器比如 ECS 也是差不多的步骤,主要是 Node.js 环境要选对)。 Ghost 搭建概述 Ghost 官方推荐…

在做题中学习(52): 山脉数组的峰顶索引

852. 山脉数组的峰顶索引 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;二分查找 思路&#xff1a;O(logn)的时间复杂度&#xff0c;很可能是二分法&#xff0c;再看看有没有二段性&#xff1a; 由题目可以知道&#xff0c;i的左边比i小&#xff0c;右边比i大&am…

《编译原理》阅读笔记:p4-p17

《编译原理》学习第 2 天,p4-p17总结,总计 14 页。 一、技术总结 1.structure of compiler 编译器组成包括:Lexical Analyzer -> Syntax Analazer -> Semantic tree -> Intermediate Code Generator -> Machine-Independent Code Optimizer -> Code Genera…

力扣刷题第1天:消失的数字

大家好啊&#xff0c;从今天开始将会和大家一起刷题&#xff0c;从今天开始小生也会开辟新的专栏。&#x1f61c;&#x1f61c;&#x1f61c; 目录 第一部分&#xff1a;题目描述 第二部分&#xff1a;题目分析 第三部分&#xff1a;解决方法 3.1 思路一&#xff1a;先排序…

扩展学习|本体研究进展

文献来源&#xff1a; 王向前,张宝隆,李慧宗.本体研究综述[J].情报杂志,2016,35(06):163-170. 一、本体的定义 本体概念被引入人工智能、知识工程等领域后被赋予了新的含义。然而不同的专家学者对本体的理解不同,所给出的定义也有所差异。 人工智能领域的学者Neches(1991)等人对…

计算机考研|25人太难了,408会炸,还是自命题会炸?

自命题已经不是炸不炸的问题了&#xff0c;是有没有学上的问题。 我记得去年九月一些学校宣布改考408的时候&#xff0c;整个群里都炸了&#xff0c;同学一片哀嚎。要知道九月的时候要重新准备408肯定是不可能了&#xff0c;一来408复习的基础阶段已经过去了&#xff0c;二来英…

【stomp 实战】spring websocket 接收消息源码分析

后台消息的发送过程&#xff0c;我们通过spring websocket用户消息发送源码分析已经了解了。我们再来分析一下后端接收消息的过程。这个过程和后端发送消息过程有点类似。 前端发送消息 前端发送消息给服务端的示例如下&#xff1a; 发送给目的/app/echo一个消息。 //主动发…

13_Scala面向对象编程_伴生对象

文章目录 1.伴生对象1.1 scala的一个性质&#xff0c;scala文件中的类都是公共的&#xff1b;1.2 scala使用object关键字也可以声明对象&#xff1b; 3.关于伴生对象和类4.权限修饰符&#xff0c;scala仅有private;5.伴生对象可以访问伴生类中的私有属性&#xff1b;6.案例7.伴…

Scurm冲刺第四天

Scurm冲刺第四天 1. 站立式会议内容昨日已完成任务 今日计划完成任务首页代码设计实现 前端UI设计代码编写(收藏页面,商品详情页,个人中心页)后端用户功能模块的购物车,收藏和个人中心操作功能 后端管理员模块功能实现(登录注册功能,用户管理功能,个人中心操作)跟进前后…

度小满——征信报告图建模

目录 背景介绍 发展趋势 技术演进 图在金融风控领域中的演进 度小满图机器学习技术体系 案例 征信报告介绍 征信报告图建模

【专题】2022年中国企业数字化学习行业研究报告PDF合集分享(附原数据表)

报告链接:http://tecdat.cn/?p=32263 多变,不确定性,复杂,模糊不清的新业务图景,加快了公司人才发展模式的数字化转变;疫情冲击离线运输与公司现金流量,消费者支出减少,机构表现受压,数字化学习突破;行业数字化水平不断提高,商业体系和学习体系之间的关联性不断加强…

linux调试

文章目录 1. 使用打印来调试1.1 重定向1.2 标准预定义宏1.3 日志代码 2. 内核异常2.1 内核打印2.1.1 打印级别2.1.2 跟踪异常2.1.3 动态打印2.1.4 RAM console 2.2 OOPS2.2.1 有源代码的情况2.2.2 没有源代码的情况 3 查看日志4 工具调试 1. 使用打印来调试 1.1 重定向 2>…