Go 语言文件 I/O 和 OS 操作

2024-08-31 00:44
文章标签 语言 go 操作 os

本文主要是介绍Go 语言文件 I/O 和 OS 操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 读取文件

        在 Go 中,可以使用 io/ioutil 包对文件执行标准输入/输出(I/O)操作。该包提供了执行读取和写入文件等标准 I/O 操作的例程。下面代码将名为 的文件读入内存,并将内容显示为字符串。

package mainimport ("fmt""io/ioutil"
)func main(){data,err := ioutil.ReadFile("flat01.txt")if err != nil {fmt.Println(err)}fmt.Print(string(data))
}

        首先,导入包含要使用 I/O 函数的 io/ioutil 包。然后从系统当前目录中读取 flat.txt 文件。注意,也可以从其他位置读取文件。可以将相对或绝对路径包含在传递给 ReadFile 函数的字符串中。不过,Go 需要使用正斜杠(/) 来分隔目录。例如,以下代码将从名为 datafiles 的子文件夹中读取文件。

data,err := ioutil.ReadFile("./datafiles/flatland01.txt")

        调用 ReadFile 函数时包含错误处理。任何错误都将返回第二个变量 err 中。文件数据本身将返回到第一个变量 data 中。

        在代码清单中,调用 ReadFile 函数后,将进行测试以查看是否在读取过程中出现错误。如果文件读取没有任何问题,则将错误值(err) 设置为 nil。如果 err 不为 nil,则会显示从文件读取时出现的错误。

        最后,将文件内容转换为字符串并将其显示给用户。假设文件路径正确,输出看起来应像下面这样。

FLATLANDPART 1THIS WORLDSECTION 1  Of the Nature of FlatlandI call our world Flatland, not because we call it so, but to make its
nature clearer to you, my happy readers, who are privileged to live in
Space.Imagine a vast sheet of paper on which straight Lines, Triangles,
Squares, Pentagons, Hexagons, and other figures, instead of remaining
fixed in their places, move freely about, on or in the surface, but
without the power of rising above or sinking below it, very much like
shadows--only hard with luminous edges--and you will then have a pretty
correct notion of my country and countrymen.  Alas, a few years ago, I
should have said "my universe:"  but now my mind has been opened to
higher views of things.In such a country, you will perceive at once that it is impossible that
there should be anything of what you call a "solid" kind; but I dare
say you will suppose that we could at least distinguish by sight the
Triangles, Squares, and other figures, moving about as I have described
them.  On the contrary, we could see nothing of the kind, not at least
so as to distinguish one figure from another.  Nothing was visible, nor
could be visible, to us, except Straight Lines; and the necessity of
this I will speedily demonstrate.
1.1 panic 函数

        在处理文件时,需要注意可能会出现问题,例如找不到预期的文件。可以使用 panic 函数来指示程序中的错误或意外行为。panic 主要用于在不确定如何处理错误时通知程序失败。例如在下面代码中,使用 ReadFile 函数通过文件名读取文件。如果出现错误,则使用 panic 函数使程序失败。

package mainimport ("os""fmt"
)func main(){data,err := ioutil.ReadFile("badFileName.txt")if err != nil {panic(err)}fmt.Print(strings(data))
}

运行结果如下所示:

panic:open badFileName.txt:The system cannot find the file specified.goroutine 1 [running]:
main.main()/root/abc.go:14 +0x97
exit status 2

        基本上,当程序遇到错误时,它并不一定会停止运行。可以使用 panic 函数强制停止程序,以允许其他优雅地退出。

1.2 读取文件的一部分

        许多情况下,我们不需要使用整个文件。Go 提供了只检索文件一部分的选项。在现代计算机系统中,每个字符串字符由一个字节表示。可以使用此单位从文本文件中检索字符集。

        在下面的程序清单中,没有读取整个文件,而是从文件中检索了前 5 个字母。

package mainimport ("fmt""os"
)func main() {f, err := os.Open("flat01.txt")if err != nil {fmt.Println(err)}b1 := make([]byte, 5)data, err := f.Read(b1)if err != nil {fmt.Println(err)}fmt.Println(string(b1[:data]))f.Close()
}

        如果在打开或读取文件时没有出现任何错误,则输出将看起来像下面这样。

FLATL

        这里首先使用 os 库,os 库包括文件管理工具。在调用 Open 函数时会看到这一点。

f,err := os.Open("flat01.txt")

        在这个代码清单中,从文件中检索前 5 个字节的数据。由于这是一个文本文件,这些字节是文件中的字符。在代码清单中,创建了一个长度为 5 的字节切片,并将其命名为 b1。然后,使用这个切片从文件中读取数据。

b1 := make([]byte,5)
data,err := f.Read(b1)

        在读取文件后,将检查是否有错误(err != nil)。如果是,则打印错误。在检查错误后,将显示切片的内容。

        最后一个操作是关闭打开的文件。可以通过调用文件的 Close 方法来做到这一点。

f.Close()

        当使用 flat01.txt 文件执行该代码清单时,前 5 个字符显示如下。

FLATL
1.3 defer 语句

        在打开文件后,一定要记得关闭文件。然而,在较长的代码清单中,在到达关闭语句之前可能会发生一些事情,导致程序过早退出。这意味着文件没有被正常关闭,可能会引起问题。为确保文件被关闭,可以使用 defer 语句。

        defer 语句将函数的执行推迟到周围的函数返回(无论是正常退出还是通过 panic)。这意味着延迟的函数将在主函数中最后执行,而不管这些函数在程序中出现的顺序如何。下面的代码展示了一个使用 defer 的简单示例。

package mainimport ("fmt"
)func main() {defer fmt.Println("Hello")fmt.Println("World")
}

因为输出 “Hello" 的 Println 命令被延迟执行,所以输出结果如下:

World
Hello

        通过使用 defer 语句,可以在打开或创建文件之后而不是稍后在代码清单中添加一个文件关闭语句。这将确保如果发生意外情况,则会关闭文件。

1.4 从特定的起点读取文件

        虽然文件的前几个字符可能有助于确定文件的内容,但通常需要检索文件的特定部分。Seek 函数允许指定文件中的起始位置并从那里开始读取文件。下列代码使用 os.Seek 函数执行 100 字节的偏移量。然后,从该点读取 20 个字符。

这篇关于Go 语言文件 I/O 和 OS 操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1122400

相关文章

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Python中操作Redis的常用方法小结

《Python中操作Redis的常用方法小结》这篇文章主要为大家详细介绍了Python中操作Redis的常用方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解一下... 目录安装Redis开启、关闭Redisredis数据结构redis-cli操作安装redis-py数据库连接和释放增