Golang——IO操作

        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.mzph.cn/pingmian/8638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

出差——蓝桥杯十三届2022国赛大学B组真题

问题分析 该题属于枚举类型&#xff0c;遍历所有情况选出符合条件的即可。因为只需要派两个人&#xff0c;因此采用两层循环遍历每一种情况。 AC_Code #include <bits/stdc.h> using namespace std; string str;//选择的两人 bool ok(){if(str.find("A")!-1…

Colibri for Mac v2.2.0 原生无损音频播放器 激活版

Colibri支持所有流行的无损和有损音频格式的完美清晰的比特完美播放&#xff0c;仅使用微小的计算能力&#xff0c;并提供干净和直观的用户体验。 Colibri在播放音乐时使用极少的计算能力。该应用程序使用最先进的Swift 3编程语言构建&#xff0c;BASS音频引擎作为机器代码捆绑…

java11基础(接口 static关键字)

目录 一. 接口 1. 接口的定义 2. 接口的实现 3. Comparable接口 4. 抽象类和接口的区别 小结 二. static关键字 1. 静态成员变量 2. static 静态方法 3. static静态代码块 格式: 作用: 执行顺序: 三. 接口拓展 default 和 static 一. 接口 如果一个抽象类没有字段…

【氮化镓】GaN功率器件在转换器设计中的挑战

I. 引言(INTRODUCTION) 宽带隙(WBG)器件的重要性: 引言部分首先强调了宽带隙(WBG)器件在高频、高效率电力电子技术中的关键作用。这些器件,包括碳化硅(SiC)和氮化镓(GaN),相较于传统的硅功率器件,具有显著的优势。宽带隙半导体材料的高击穿场强允许设计更薄的漂…

ADS基础教程汇总

目录 ADS基础教程1 - 软件简介ADS基础教程2 - S参数仿真ADS基础教程3 - Data Display WindowADS基础教程4 - Real Time TuningADS基础教程5 - OptimizationADS基础教程6-蒙特卡洛分析ADS基础教程7-Yiled AnalysisADS基础教程8-仿真库加载ADS基础教程9-理想模型和厂商模型实现及…

设计模式——建造者模式(Builder)

建造者模式&#xff08;Builder Pattern&#xff09;是一种对象构建的设计模式&#xff0c;它允许你以一种逐步构建的方式来创建复杂对象。建造者模式通常用于构建具有多个组成部分的对象&#xff0c;并且这些组成部分通常具有不同的构建和表示方式。 建造者模式主要包括以下几…

探索 Python:从初学者到编程达人

Python 是一门多用途的高级编程语言&#xff0c;它具有简单易学、功能丰富的特点&#xff0c;被广泛应用于 Web 开发、数据科学、人工智能等领域。无论你是初学者还是有一定编程经验的开发者&#xff0c;掌握 Python 的基础知识都是开启编程之旅的第一步。让我们一起来探索 Pyt…

不排斥温暖,不迎合热闹

在纷繁复杂的现代社会&#xff0c;每个人都在寻找自己的生活方式。有人热衷于社交活动&#xff0c;享受热闹的场面&#xff1b;而有人则偏爱宁静&#xff0c;寻求内心的平和。 拥抱温暖&#xff0c;珍视人际关系 温暖往往来源于人与人之间的深厚情感。无论是家庭的温馨、朋友…

Hive SQL-DML-insert插入数据

Hive SQL-DML-insert插入数据 1. 插入静态数据 可以直接插入具体的值到Hive表中&#xff1a; INSERT INTO TABLE tablename (column1, column2, column3) VALUES (value1, value2, value3),(value4, value5, value6),...;2. 插入查询结果 将一条查询的结果直接插入到另一个表中…

数据猎手:使用Java和Apache HttpComponents库下载Facebook图像

引言 在信息驱动的时代&#xff0c;互联网上的数据成为了无可比拟的宝藏。本文旨在探讨如何通过利用Java和Apache HttpComponents库&#xff0c;从全球最大的社交网络平台Facebook上获取图像数据。 作为全球最大的社交网络平台&#xff0c;Facebook聚集了数以亿计的用户&#…

uniapp——点赞、取消点赞

案例 更新点赞状态&#xff0c;而不是每次都刷新整个列表。避免页面闪烁&#xff0c;提升用户体验 代码 <view class"funcBtn zan" click"onZan(index,item.id)"><image src"/static/images/circle/zan.png" mode"aspectFill&…

Python基础学习之知识碎片

字符串可以用 运算符连接在一起&#xff0c;用 * 运算符重复。Python 中的字符串有两种索引方式&#xff0c;从左往右以 0 开始&#xff0c;从右往左以 -1 开始。“Python中的字符串不能改变”强调的是字符串的这一特性&#xff0c;即字符串对象一旦创建&#xff0c;其内容就是…

富文本编辑器CKEditor4简单使用-07(处理浏览器不支持通过工具栏粘贴问题 和 首行缩进的问题)

富文本编辑器CKEditor4简单使用-07&#xff08;处理浏览器不支持通过工具栏粘贴问题 和 首行缩进的问题&#xff09; 1. 前言——CKEditor4快速入门2. 默认情况下的粘贴2.1 先看控制粘贴的3个按钮2.1.1 工具栏粘贴按钮2.1.2 存在的问题 2.2 不解决按钮问题的情况下2.2.1 使用ct…

【QuikGraph】C#调用第三方库实现迪杰斯特拉(Dijkstra)算法功能

QuikGraph库介绍 项目地址&#xff1a;https://github.com/KeRNeLith/QuikGraph QuikGraph为.NET提供了通用的有向/无向图数据结构和算法。 QuikGraph提供了深度优先搜索、广度优先搜索、A*搜索、最短路径、k最短路径&#xff0c;最大流量、最小生成树等算法。 QuikGraph最初…

LeetCode|700. Search in Binary Search Tree

题目 You are given the root of a binary search tree (BST) and an integer val. Find the node in the BST that the node’s value equals val and return the subtree rooted with that node. If such a node does not exist, return null. Example 1: Input: root […

Go实现树莓派超声波测距

后面发现调用的两个Go的库进行测算还是没办法读到好的超声波值&#xff0c; 所以放弃 公式 距离(cm)&#xff08;(声速(m/s)时间(ms)&#xff09;/ 2&#xff09; *10 代码 ultrasonicSensor.go package mainimport ("context""errors""fmt"&…

设计模式——组合模式(Composite)

组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 特点 表示整体与部分&#xff1a;组合模式允许你将对象组合成树形结构…

MacOS miniconda安装方法

打开macos “终端” 应用 执行命令 mkdir -p ~/miniconda3curl https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o ~/miniconda3/miniconda.shbash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3rm -rf ~/miniconda3/mini…

腾讯云CVM服务器数据盘挂载

背景&#xff1a;新开腾讯云服务器挂载数据盘。 在腾讯云服务器上挂载数据盘通常涉及以下几个步骤&#xff0c;这里以Linux系统为例进行说明。如果您的服务器是Windows系统&#xff0c;操作界面会有所不同&#xff0c;但原理相似。1. 登录入腾讯云控制台首先&#xff0c;登录腾…

【35分钟掌握金融风控策略16】贷前风控策略详解-1

目录 贷前风控策略详解 贷前风控目标 精准审核申请贷款客户资质 对申请贷款客户进行合理定额 对申请贷款客户进行合理定价 推动实现利润最大化 贷前风控数据源 客户贷款时提供的数据 贷前风控策略详解 俗话说&#xff0c;良好的开端是成功的一半&#xff0c;而贷前是风…