Go语言学习之文件操作方法详解

 更新时间:2022年04月21日 14:13:38   作者:隐姓埋名4869  
这篇文章主要为大家详细介绍了Go语言中一些常见的文件操作,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下

引言

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

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[:]))
}

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文件中自带换行
	}
}

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")
}

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))
		}
	}
}

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

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
			}
		}
	}
}

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)
}

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()
}

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
	}
}

以上就是Go语言学习之文件操作方法详解的详细内容,更多关于Go语言文件操作的资料请关注脚本之家其它相关文章!

相关文章

  • 一文详解Golang中的errors包

    一文详解Golang中的errors包

    在 Golang 中,errors 包是用于处理错误的标准库, errors 包提供的功能比较简单,使用起来非常方便,接下来就具体讲解一下 errors 包提供的几个函数,感兴趣的小伙伴跟着小编一起来看看吧
    2023-07-07
  • 一文搞懂Golang中的内存逃逸

    一文搞懂Golang中的内存逃逸

    我们都知道go语言中内存管理工作都是由Go在底层完成的,这样我们可以不用过多的关注底层的内存问题。本文主要总结一下 Golang内存逃逸分析,需要的朋友可以参考以下内容,希望对大家有帮助
    2022-09-09
  • GO的range具体使用

    GO的range具体使用

    GO语言的for…range 能做什么呢?golang的for…range是go 身的语法,可以用来遍历数据结构,本文就详细的来介绍一下具体使用,感兴趣的可以了解一下
    2021-10-10
  • GO语言基本数据类型总结

    GO语言基本数据类型总结

    这篇文章主要介绍了GO语言基本数据类型,较为详细的总结了GO语言的基本数据类型,对于GO语言的学习有一定的借鉴参考价值,需要的朋友可以参考下
    2014-12-12
  • 完美解决golang go get私有仓库的问题

    完美解决golang go get私有仓库的问题

    这篇文章主要介绍了完美解决golang go get私有仓库的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • GO中优雅编码与降低圈复杂度详析

    GO中优雅编码与降低圈复杂度详析

    Go语法简单易用,有其他编程经验的开发者,相信学习并快速上手Go语言的开发,多数觉得不困难吧,下面这篇文章主要给大家介绍了关于GO中优雅编码与降低圈复杂度的相关资料,需要的朋友可以参考下
    2022-12-12
  • 详解go语言单链表及其常用方法的实现

    详解go语言单链表及其常用方法的实现

    这篇文章主要介绍了详解go语言单链表及其常用方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • go语言打包的网页wasm示例详解

    go语言打包的网页wasm示例详解

    这篇文章主要为大家介绍了go打包网页wasm示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2022-09-09
  • 详解Go语言的context包从放弃到入门

    详解Go语言的context包从放弃到入门

    这篇文章主要介绍了Go语言的context包从放弃到入门,本文通过实例演示给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • golang中的defer函数理解

    golang中的defer函数理解

    defer是Go语言中的延迟执行语句,用来添加函数结束时执行的代码,常用于释放某些已分配的资源、关闭数据库连接、断开socket连接、解锁一个加锁的资源,这篇文章主要介绍了golang中的defer函数理解,需要的朋友可以参考下
    2022-10-10

最新评论