Go语言 文件操作

简介: 1. 打开和关闭文件2. 读取文件2.1 defer 语句2.2 手动宕机处理2.3 打开文件并获取内容2.4 bufio 读取文件2.5 ioutil 读取文件2.6 读取奇偶行内容3. 写入文件3.1 os.OpenFile() 函数3.2 Write 和 WriteString 方式写入3.3 bufio.NewWriter 方式写入3.4 ioutil.WriteFile 方式写入

引言


计算机的文件是存储再外部介质(硬盘)上的数据集合,文件分为文本文件和二进制文件


1. 打开和关闭文件


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

close()可以释放内存空间


  • 示例:
package main
import (
  "fmt"
  "os"
)
func main() {
  //系统打开文件并赋予文件实体
  file, err := os.Open("./abc.txt")
  if err != nil {
    fmt.Println("文件打开失败", err)
  } else {
    fmt.Println("文件打开成功")
    file.Close()
    fmt.Println("文件关闭成功")
  }
}
//输出结果如下
文件打开失败 open ./abc.txt: The system cannot find the file specified.
package main
import "fmt"
func hello() {
  defer fmt.Println("执行defer") //延迟处理,函数关闭前执行
  for i := 0; i < 10; i++ {
    fmt.Println(i)
    if i == 8 {
      //手动宕机处理,立马关闭当前程序,并释放内存空间
      panic("程序宕机") //阈值
    }
  }
}
func main() {
  hello()
}


2. 读取文件


接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回0和 io.EOF

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


2.1 defer 语句


  • 示例:

defer—般用于资源的释放和异常的捕捉。

defer语句会将其后面跟随的语句进行延迟处理;跟在defer后面的语言将会在程序进行最后的return之后再执行

在defer归属的函数即将返回时,将延迟处理的语句按defer的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被 defer 的语句,最先被执行。


package main
import "fmt"
func main() {
  defer fmt.Println("执行defer语句")  //延迟处理,函数关闭前执行
  for i := 0; i < 5; i++ {
    fmt.Println(i)
  }
}
//输出结果如下
0
1
2
3
4
执行defer语句


2.2 手动宕机处理


package main
import "fmt"
func hello() {
  defer fmt.Println("执行defer")  //延迟处理,函数关闭前执行
  for i := 0; i < 10; i++ {
    fmt.Println(i)
    if i == 8 {
      //手动宕机处理,立马关闭当前程序,并释放内存空间
      panic("程序宕机") 
    }
  }
}
func main() {
  hello()
}



2.3 打开文件并获取内容


package main
import (
  "fmt"
  "io"
  "os"
)
func main() {
  //读取文件
  file, err := os.Open("./abc.txt")
  if err != nil {
    fmt.Println("文件打开失败", err)
    return
  }
  defer file.Close()    //main函数结束前执行文件资源释放
  fmt.Println("文件打开成功")
  //定义参数切片
  var result [128]byte
  n, err := file.Read(result[:])  //以切片的形式读取
  //文件读取完成,进行判断
  if err == io.EOF {
    fmt.Println("文件读取完毕", err)
    return
  }
  //读取过程中出现异常
  if err != nil {
    fmt.Println("文件读取失败", err)
    return
  }
  fmt.Printf("字节数: %d 个\n", n)
  fmt.Printf("获取的内容是: %s", string(result[:]))
}

d314f32fc978436fa32d2c4fbac042b7.png


2.4 bufio 读取文件


使用bufio读取,bufio 在 file 的基础上封装了一层API,支持更多的功能


package main
import (
  "bufio"
  "fmt"
  "io"
  "os"
)
func main() {
  //读取文件
  file, err := os.Open("./abc.txt")
  if err != nil {
    fmt.Println("文件打开失败", err)
    return
  }
  //main函数结束前执行文件资源释放
  defer file.Close()
  //bufio缓冲区读取
  reader := bufio.NewReader(file)
  //循环读取内存,输出到程序中
  for {
    str, err := reader.ReadString('\n')   //按行读取,值赋予给str
    if err == io.EOF {
      fmt.Print(str)    //要输出,否则不显示最后一行
      // fmt.Println("文件读取完毕")
      return
    }
    if err != nil {
      fmt.Println("文件读取异常", err)
      return
    }
    fmt.Print(str)    //取消ln文件中自带换行
  }
}


ca7fe1ac1ee544dbaed2d64b3bb8cf0e.png


2.5 ioutil 读取文件


package main
import (
  "fmt"
  "io/ioutil"
)
func ReaderFile(path string) {
  content, err := ioutil.ReadFile(path)
  if err != nil {
    fmt.Println("文件读取异常")
    return
  }
  fmt.Println(string(content))  //转换string格式并输出
}
func main() {
  ReaderFile("./abc.txt")
}


cff07187630b4cb3b938a0aec04f7525.png


2.6 读取奇偶行内容


package main
import (
  "bufio"
  "fmt"
  "io"
  "os"
)
func main() {
  //读取文件
  file, err := os.Open("./abc.txt")
  if err != nil {
    fmt.Println("文件打开失败", err)
    return
  }
  //main函数结束前执行文件资源释放
  defer file.Close()
  //bufio缓冲区读取
  reader := bufio.NewReader(file)
  //计数奇偶行
  count := 0
  for {
    str, _, err := reader.ReadLine()
    count++
    if err == io.EOF {
      // fmt.Println("文件读取完毕")
      return
    }
    if err != nil {
      fmt.Println("文件读取异常", err)
      return
    }
    if count%2 == 1 {
      fmt.Println(string(str))
    }
  }
}


cff07187630b4cb3b938a0aec04f7525.png

登录并判断用户名是否存在


package main
import (
  "bufio"
  "fmt"
  "io"
  "os"
)
//读取文件
func main() {
  //var doing bool
  var name string
  fmt.Print("请输入用户名:")
  fmt.Scan(&name)
  //defer fmt.Println("用户不存在")
  file, err := os.Open("./abc.txt")
  if err != nil {
    fmt.Println("文件打开失败", err)
    return
  }
  //main函数结束前,执行文件资源释放
  defer file.Close()
  //利用bufio缓冲区读取文件
  reader := bufio.NewReader(file) //建立缓冲区,将文件内容放入到缓冲区
  //计数奇偶行
  a := 0
  for {
    str, _, err := reader.ReadLine()
    //每次读取,a+1
    a++
    if err == io.EOF {
      fmt.Println("文件读取完毕")
      //如果文件读取完,也没有返回,则说明用户不存在
      fmt.Println("用户不存在")
      return
    }
    if err != nil {
      fmt.Println("文件读取错误")
      return
    }
    if a%2 == 1 {
      if name == string(str) {
        fmt.Println("登录成功")
        return
      }
    }
  }
}

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/a444b2a6c17342a7936dce1c356e11c8.png#pic_center=600x)


3. 写入文件


3.1 os.OpenFile() 函数


os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。

  • 语法格式如下:
func OpenFile(name string,flag int,perm FileMode)(*File,error) {
  ...
}
name:要打开的文件名
flag:打开文件的模式
  • 模式种类:

模式|含义|

|--|--|--

|os.O_WRONLY|只写|

|os.O_CREATE|创建文件|

|os.O_RDONLY|只读|

|os.O_RDWR|读写|

|os.O_TRUNC|清空|

|os.O_APPEND|追加|

perm:文件权限,一个八进制数。r(读)04,W(写)02,x(执行)01


3.2 Write 和 WriteString 方式写入


package main
import (
  "fmt"
  "os"
)
//使用write和writestring写入
func main() {
  //写入方式打开文件,创建新文件,开启只写模式,文件权限644
  file, err := os.OpenFile("abc.txt", os.O_CREATE|os.O_WRONLY, 0644)
  if err != nil {
    fmt.Println("文件打开失败", err)
    return
  }
  //字节切片写入
  file.Write([]byte("this is byte write\n"))
  //字符串写入
  str := "this is string write"
  file.WriteString(str)
}


397aa3ce3f164107a18e968de7fa8b28.png


3.3 bufio.NewWriter 方式写入


package main
import (
  "bufio"
  "fmt"
  "os"
)
//bufio写入
func main() {
  file, err := os.OpenFile("tmp.txt", os.O_CREATE|os.O_WRONLY, 0666)   //WRONLY,清空
  if err != nil {
    fmt.Println("文件打开失败", err)
    return
  }
  defer file.Close()
  //文件写入缓冲区
  write := bufio.NewWriter(file)
  for i := 0; i < 5; i++ {
    //内容写入缓冲区
    write.WriteString("this is bufio write\n")
  }
  //缓冲区数据提交写入文件
  write.Flush()
}


e8b0ea336cdc4ae9852966e26aa51280.png


3.4 ioutil.WriteFile 方式写入


package main
import (
  "fmt"
  "io/ioutil"
)
func main() {
  str := "this is ioutil write\nthis is test content"
  //iotuil方式直接写入,字符串转换成字节数组写入
  err := ioutil.WriteFile("./tmp.txt", []byte(str), 0666)
  if err != nil {
    fmt.Println("文件写入失败", err)
    return
  }
}


![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/e170c294440d4eb0a1de65e807fa08ab.png#pic_center=555x)

目录
打赏
0
0
0
0
8
分享
相关文章
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
初探Go语言RPC编程手法
总的来说,Go语言的RPC编程是一种强大的工具,让分布式计算变得简单如同本地计算。如果你还没有试过,不妨挑战一下这个新的编程领域,你可能会发现新的世界。
64 10
|
5月前
|
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
127 3
Go 语言入门指南:切片
|
5月前
|
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
本文探讨了如何利用 Go 语言中的 Bloom Filter 算法提升公司局域网管理系统的性能。Bloom Filter 是一种高效的空间节省型数据结构,适用于快速判断元素是否存在于集合中。文中通过具体代码示例展示了如何在 Go 中实现 Bloom Filter,并应用于局域网的 IP 访问控制,显著提高系统响应速度和安全性。随着网络规模扩大和技术进步,持续优化算法和结合其他安全技术将是企业维持网络竞争力的关键。
107 2
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
|
5月前
|
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
143 20
eino — 基于go语言的大模型应用开发框架(二)
本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的`ChatModel`接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。`Generate`方法用于生成完整的模型响应,`Stream`方法以流式方式返回结果,`BindTools`方法为模型绑定工具。此外,还介绍了通过`Option`模式配置模型参数及模板功能,支持基于前端和用户自定义的角色及Prompt。目前主要聚焦于`ChatModel`的`Generate`方法,后续将继续深入学习。
731 7
eino — 基于go语言的大模型应用开发框架(一)
Eino 是一个受开源社区优秀LLM应用开发框架(如LangChain和LlamaIndex)启发的Go语言框架,强调简洁性、可扩展性和可靠性。它提供了易于复用的组件、强大的编排框架、简洁明了的API、最佳实践集合及实用的DevOps工具,支持快速构建和部署LLM应用。Eino不仅兼容多种模型库(如OpenAI、Ollama、Ark),还提供详细的官方文档和活跃的社区支持,便于开发者上手使用。
1110 8
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
82 3
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等