GO语言-11Go语言的I/O操作

简介: GO语言的学习与记录,第十一篇了解Go语言的I/O操作,学习Go语言中两种打开文件的方式,一种是默认只读,另外一种是以权限的方式打开文件,并对文件的读写基本操作进行介绍入门
初心是记录和总结,自己学习Go语言的历程。如果能帮助到你,这是我的荣幸。

Go语言进行I/O操作的时候是以文件的的指针*file进行操作的。I/O操作我们需要使用到os这个内置包。以常用的几个例子和注意事项,了解I/O基本操作。

以只读的方式打开文件

使用Open方法:func Open(name string) (*File, error),默认是以只读的方式打开文件。

  • 传入文件地址
  • 返回文件指针 及 error,成功打开文件的话 error 为nil,可以用来判断是否打开文件成功
func main() {
    fmt.Println("打开文件")
    open, err := os.Open("./password.txt") // 返回两个值,第一个是文件对象的指针*File,第二个是判断文件是否存在
    if err != nil {
       fmt.Println("文件打开失败,请查询原因")
       fmt.Println(err)
    }
    fmt.Println(open) // 输出的是文件的指针
    defer open.Close() // defer关键字等待最后时统一调用该方法
}
注意!使用GoLand的朋友们(和我一样的萌新):

当你没有使用命令行执行测试代码时,请注意读取文件的根路径是在working directory,如果这个位置不对的话,你很容易得到一个错误:open ./password.txt: The system cannot find the file specified.

image.png


读取文件的内容

OK!我们知道Open默认是以只读的方式打开文件了,是时候读取文件的内容了。

使用Read方法:func (f *File) Read(b []byte) (n int, err error)

  • 这里方法有接收者,是一个文件指针,刚好Open方法就返回了一个文件指针
  • 参数是需要一个byte数组,用于每次读入len(b)的内容,并将他们存在b数组中
  • 返回的第一个参数表示的是读取到的字节长度

好!看完方法,我们来理一理思路。

  1. 既然需要len(b),那我们一定要先指定好byte的长度
  2. 需要定义一个定长的数组,就像缓冲一样,每次读数组长度的内容。(等等,如果超过数组长度了呢?所以这个定长数组就是缓冲无误了)
  3. 需要定义一个切片,切片是可以无限长的(内存无限),需要将数组中读到的内容存在切片中
  4. 这涉及到循环读文件内容,终止条件是什么呢?

根据已有思路我们先写代码:

// main

    fmt.Println("读取文件")
    var buf [64]byte
    var content []byte
    for {
       n, err := open.Read(buf[:])
       if err != nil {
          fmt.Println("read file err ", err)
          return
       }
       content = append(content, buf[:n]...)
    }
    fmt.Println(string(content))

这里涉及到几个巧的方法是关于切片中取值的方式,用在了数组中

buf[:] 等于将整个数组变为了切片

buf[:n] 执行完Read方法后将读入存在buf中的内容,即时buf中有旧值也没关系。

写文件

当我尝试着使用os.的方式,我看见了这个方法名:OpenFile

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

解读:

  • name 参数和Open方法一样传入文件的地址
  • flag 这个就有点意思了见下表(常用的)
  • perm 表示如果文件不存在,那么就创建文件,并赋予文件相应的权限
内容 作用说明
O_RDONLY 以只读方式打开文件
O_WRONLY 以只写打开文件(写入会从头覆盖原有内容)
O_RDWR 以读写方式打开文件(写入会从头覆盖原有内容)
O_APPEND 写入时以追加的方式(不会覆盖原有内容)
O_CREATE 若文件不存在则创建文件
O_EXCL 强制创建,文件必须不存在
O_SYNC 以同步的方式进行I/O

例子:

file, err := os.OpenFile("./password.txt", os.O_WRONLY, 0777)
fmt.Println(file)
fmt.Println(err2)
read(file) // 封装了一个read函数,尝试去读文件时,因为设置的打开方式是O_WRONLY,所以会报错

当我们带的方式打开文件了之后,返回的文件指针就可以操作写的动作了,下面列举几个常用的

WriteString 直接写一串字符

方法:func (f *File) WriteString(s string) (n int, err error)

通过一个file指针的对象调用WriteString方法,传入一个字符串作为写入的参数,返回的是写入的长度和是否有错误产生。

注意写的时候要关注到文件指针打开文件的权限方法是什么,见上表

WriteAt 指定从哪开始写

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

通过一个file指针的对象调用WriteAt方法,指定从off位开始写(文件默认从0开始),将b写入文件中,返回写入长度,是否有错误。

str := "张三"
bytes := []byte(str)
fmt.Println(len(bytes))
file.WriteAt(bytes, 0)
目录
相关文章
|
17小时前
|
数据采集 人工智能 搜索推荐
快速入门:利用Go语言下载Amazon商品信息的步骤详解
本文探讨了使用Go语言和代理IP技术构建高效Amazon商品信息爬虫的方法。Go语言因其简洁语法、快速编译、并发支持和丰富标准库成为理想的爬虫开发语言。文章介绍了电商网站的发展趋势,如个性化推荐、移动端优化和跨境电商。步骤包括设置代理IP、编写爬虫代码和实现多线程采集。提供的Go代码示例展示了如何配置代理、发送请求及使用goroutine进行多线程采集。注意需根据实际情况调整代理服务和商品URL。
快速入门:利用Go语言下载Amazon商品信息的步骤详解
|
2天前
|
存储 编译器 Go
Go语言学习12-数据的使用
【5月更文挑战第5天】本篇 Huazie 向大家介绍 Go 语言数据的使用,包含赋值语句、常量与变量、可比性与有序性
37 6
Go语言学习12-数据的使用
|
3天前
|
Java Go
一文带你速通go语言指针
Go语言指针入门指南:简述指针用于提升效率,通过地址操作变量。文章作者sharkChili是Java/CSDN专家,维护Java Guide项目。文中介绍指针声明、取值,展示如何通过指针修改变量值及在函数中的应用。通过实例解析如何使用指针优化函数,以实现对原变量的直接修改。作者还邀请读者加入交流群深入探讨,并鼓励关注其公众号“写代码的SharkChili”。
9 0
|
3天前
|
存储 缓存 Java
来聊聊go语言的hashMap
本文介绍了Go语言中的`map`与Java的不同设计思想。作者`sharkChili`是一名Java和Go开发者,同时也是CSDN博客专家及JavaGuide项目的维护者。文章探讨了Go语言`map`的数据结构,包括`count`、`buckets指针`和`bmap`,解释了键值对的存储方式,如何利用内存对齐优化空间使用,并展示了`map`的初始化、插入键值对以及查找数据的源码过程。此外,作者还分享了如何通过汇编查看`map`操作,并鼓励读者深入研究Go的哈希冲突解决和源码。最后,作者提供了一个交流群,供读者讨论相关话题。
14 0
|
4天前
|
Java Go
Go语言学习11-数据初始化
【5月更文挑战第3天】本篇带大家通过内建函数 new 和 make 了解Go语言的数据初始化过程
17 1
Go语言学习11-数据初始化
|
4天前
|
自然语言处理 安全 Java
速通Go语言编译过程
Go语言编译过程详解:从词法分析(生成token)到句法分析(构建语法树),再到语义分析(类型检查、推断、匹配及函数内联)、生成中间码(SSA)和汇编码。最后,通过链接生成可执行文件。作者sharkchili,CSDN Java博客专家,分享技术细节,邀请读者加入交流群。
22 2
|
5天前
|
Java Linux Go
一文带你速通Go语言基础语法
本文是关于Go语言的入门介绍,作者因其简洁高效的特性对Go语言情有独钟。文章首先概述了Go语言的优势,包括快速上手、并发编程简单、设计简洁且功能强大,以及丰富的标准库。接着,文章通过示例展示了如何编写和运行Go代码,包括声明包、导入包和输出语句。此外,还介绍了Go的语法基础,如变量类型(数字、字符串、布尔和复数)、变量赋值、类型转换和默认值。文章还涉及条件分支(if和switch)和循环结构(for)。最后,简要提到了Go函数的定义和多返回值特性,以及一些常见的Go命令。作者计划在后续文章中进一步探讨Go语言的其他方面。
10 0
|
6天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
14 1
|
6天前
|
Go
|
7天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
135 1