Go语言文件开关及读写操作示例

目录
  • ️ 实战场景
    • 打开关闭文件
    • 读取文件
    • bufio 读取文件
    • 写文件

️ 实战场景

本篇博客为大家再次带来 Go 语言的基础知识,这次要学习的内容是 Go 中的文件操作。

打开关闭文件

在 Go 中操作文件,首先要做的就是导入 os 模块,该模块中具备相关函数定义。

package main
import (
	"fmt"
	"os"
)
func main() {
	// 打开文件
	file, err := os.Open("./ca.txt")
	if err != nil {
		fmt.Println("文件打开失败", err)
		return
	}
	print(file) // 输出地址 0xc000006028
	// 关闭文件
	file.Close()
}

如果文件打开失败,直接展示错误信息,正确的话,会返回 file 对象的地址。

读取文件

使用 Read 函数读取文件,其定义如下所示:

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

从定义中可以发现,Read 函数会返回 2 个值,第一个是读取的字节数,第二个是当读取报错时,返回错误信息,示例代码如下所示:

package main
import (
	"fmt"
	"io"
	"os"
)
func main() {
	// 打开文件
	file, err := os.Open("./ca.txt")
	if err != nil {
		fmt.Println("打开文件失败,错误信息:", err)
		return
	}
	// 为了防止忘记关闭文件,可使用defer注册文件关闭语句
	defer file.Close()
	// Read方法读取数据
	var tmp = make([]byte, 128)
	// 读取文件
	n, err := file.Read(tmp)
	// 碰到 io.EOF 表示文件读取到末尾
	if err == io.EOF {
		fmt.Println("文件读取完毕")
		return
	}
	if err != nil {
		fmt.Println("读取文件失败,错误信息:", err)
		return
	}
	fmt.Printf("读取了 %d 字节数据\n", n)
	fmt.Println(string(tmp[:n]))
}

输出如下内容:

读取了 24 字节数据
姓名:梦想橡皮擦

读取到 24 个字节,标准的中文占 3 个字节。

但是上述代码最大的问题就是,我们给变量 tmp,即数组 tmp 仅设置了 128 字节,如果待读取的文件超过了改值,例如 txt 内容如下所示:

姓名:梦想橡皮擦1
姓名:梦想橡皮擦2
姓名:梦想橡皮擦3
姓名:梦想橡皮擦4
姓名:梦想橡皮擦5

此时运行代码,就会发现 Read 函数读取到第 128 个字节的时候,就会停止读取,间接导致读取到的数据乱码。

读取了 128 字节数据
姓名:梦想橡皮擦1
姓名:梦想橡皮擦2
姓名:梦想橡皮擦3
姓名:梦想橡皮擦4
姓名:梦想橡��

解决该问题,需要用到 for 循环读取文件数据,代码如下:

package main
import (
	"fmt"
	"io"
	"os"
)
func main() {
	// 打开文件
	file, err := os.Open("./ca.txt")
	if err != nil {
		fmt.Println("打开文件失败,错误信息:", err)
		return
	}
	defer file.Close()
	// 声明一个 content 切片
	var content []byte
	var tmp = make([]byte, 128)
	for {
		n, err := file.Read(tmp)
		if err == io.EOF {
			fmt.Println("文件读取完毕")
			break
		}
		if err != nil {
			fmt.Println("读取文件失败,错误信息:", err)
			return
		}
		// 追加数据
		content = append(content, tmp[:n]...)
	}
	fmt.Println(string(content))
}

上述代码声明了一个动态数组,即切片,解决了读取数据不足的问题。

bufio 读取文件

该函数可以一次读取一行数据,示例代码如下:

func main() {
	file, err := os.Open("./ca.txt")
	if err != nil {
		fmt.Println("打开文件失败,错误信息:", err)
		return
	}
	defer file.Close()
	reader := bufio.NewReader(file)
	for {
		// 逐行读取数据
		line, err := reader.ReadString('\n')
		if err == io.EOF {
			if len(line) != 0 {
				fmt.Println(line)
			}
			fmt.Println("文件读取完毕")
			break
		}
		if err != nil {
			fmt.Println("读取文件失败,错误信息:", err)
			return
		}
		fmt.Print(line)
	}
}

该函数与 Python 中的 readline 具备同样的效果,接下来演示一下读取整个文件,代码如下:

package main
import (
	"fmt"
	"io/ioutil"
)
func main() {
	content, err := ioutil.ReadFile("./ca.txt")
	if err != nil {
		fmt.Println("打开文件失败,错误信息:", err)
		return
	}
	fmt.Println(string(content))
}

注意导入模块的时候,直接导入了 io 包中的 ioutil 函数。

写文件

使用 os.OpenFile() 函数可以指定模式打开文件,即可以写入的方式打开文件。

写入文件最常用的函数是 WriteWriteString,示例代码如下所示:

package main
import (
	"fmt"
	"os"
)
func main() {
	file, err := os.OpenFile("ca.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
	if err != nil {
		fmt.Println("打开文件失败,错误信息:", err)
		return
	}
	defer file.Close()
	name := "橡皮擦"
	file.Write([]byte(name))  //写入字节切片
	file.WriteString("梦想橡皮擦") //写入字符串
}

使用该方式写入文件,会覆盖之前的文件内容,查看结果可直接打开目录下的 ca.txt 进行查看。

我们将 os.OpenFile("ca.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) 中的参数进行单独的说明。

第一个参数表示文件名,第二个参数是打开文件的模式,具体模式如下所示:

os.O_WRONLY:只写;

os.O_CREATE:创建文件;

os.O_RDONLY:只读;

os.O_RDWR:读写;

os.O_TRUNC:清空;

os.O_APPEND:追加。

可以看到与 Python 中的文件模式基本一致。

最后一个参数值 0666 表示文件权限(八进制),这与 linux 文件权限数字一致,读 r 等于 4(感谢博友指出该错误),写 w 表示 2,执行 x 等于 1,所以 666 表示的是文件可读,可写。

在文件写入部分,还存在 bufio.NewWriter 整行写入,ioutil.WriteFile 整体写入等内容,可以学习的时候重点查阅一下。

以上就是Go语言文件开关及读写操作示例的详细内容,更多关于Go文件开关读写操作的资料请关注我们其它相关文章!

(0)

相关推荐

  • Golang 文件操作:删除指定的文件方式

    我就废话不多说了,大家还是直接看代码吧~ package main import "os" func main () { err := os.Remove(logFile) if err != nil { // 删除失败 } else { // 删除成功 } } 补充:[Golang]文件/文件夹一般操作:判断.复制.删除.遍历 1. 检查指定路径是否为文件夹 func IsDir(name string) bool { if info, err := os.Stat(name); e

  • 一文搞懂Golang文件操作增删改查功能(基础篇)

    前言 目前,Golang 可以认为是服务器开发语言发展的趋势之一,特别是在流媒体服务器开发中,已经占有一席之地.很多音视频技术服务提供商也大多使用 Golang 语言去做自己的后台服务开发,业内貌似已经达成了某种共识.今天我们不聊特别深奥的机制和内容,就来聊一聊 Golang 对于文件的基本操作. 正文 开始之前,讲一个非常有意思的小桥段.最开始接触 Golang 这种语言的时候,我总感觉它和 Google 单词比较像,所以一度怀疑二者有什么联系.后来一查才发现,二者确实有联系,晕- -因为 G

  • django框架基于模板 生成 excel(xls) 文件操作示例

    本文实例讲述了django框架基于模板 生成 excel(xls) 文件操作.分享给大家供大家参考,具体如下: 生成Excel 文件,很多人会采用一些开源的库来实现,比如python 自带 csv 库可以生成类似Excel  一样的东西,当然还有一些专门处理 excel 的库,我以前也有用过,比如这里: //www.jb51.net/article/163408.htm 我介绍过用第三方的库来实现.但事实上还有另外一种办法,采用模板的方法. 虽然标题写的是利用 django 模板来实现,其实并一

  • Django框架静态文件处理、中间件、上传文件操作实例详解

    本文实例讲述了Django框架静态文件处理.中间件.上传文件操作.分享给大家供大家参考,具体如下: Django静态文件处理.中间件.上传文件 静态文件处理 在Django中,一般专门创建一个static目录来存放静态文件(css,js,image,video等文件). a. 在创建目录前,我们需要配置静态文件的路径.如: #在项目的settings.py文件中,配置STATIC_URL,一般默认是: STATIC_URL = '/static/' # '/static/'是指uri,映射下面的

  • golang解析yaml文件操作

    首先安装解析的第三方包: go get gopkg.in/yaml.v2 示例: package main import ( "os" "log" "fmt" "encoding/json" "gopkg.in/yaml.v2" ) type Config struct { Test Test `yaml:"test"` } type Test struct { User []strin

  • Go语言文件开关及读写操作示例

    目录 ️ 实战场景 打开关闭文件 读取文件 bufio 读取文件 写文件 ️ 实战场景 本篇博客为大家再次带来 Go 语言的基础知识,这次要学习的内容是 Go 中的文件操作. 打开关闭文件 在 Go 中操作文件,首先要做的就是导入 os 模块,该模块中具备相关函数定义. package main import ( "fmt" "os" ) func main() { // 打开文件 file, err := os.Open("./ca.txt")

  • PHP文件打开关闭及读写操作示例解析

    前言 PHP支持文件上传功能,因此学习PHP文件的相关操作是必须的,这篇笔记会去记录PHP文件系统的相关知识. 文件打开与关闭 文件处理包括读取.关闭.重写等,例如,访问一个文件需要3步:打开文件.读写文件和关闭文件.其他的操作要么是包含在读写文件中(如显示内容.写入内容等),要么与文件自身的属性有关系(如文件遍历.文件改名等). 1.打开文件 在PHP中使用fopen()函数打开文件,fopen()函数的语法如下: resource fopen ( string filename, strin

  • GO文件创建及读写操作示例详解

    目录 三种文件操作比较 ioutil ioutil.ReadFile读 ioutil.WriteFile 写 ioutil.ReadAll 读 ioutil.ReadDir 查看路径下目录信息 ioutil.TempDir 创建临时目录 ioutil.TempFile 创建临时文件 os.file 方法 os.OpenFile() 创建文件 写入数据三种方式 第一种-WriteString( )函数 第二种-Write( )函数 第三种-WriteAt( )函数 读取文件 Read 读取文件 按

  • Python内存读写操作示例

    本文实例讲述了Python内存读写操作.分享给大家供大家参考,具体如下: Python中的读写不一定只是文件,还有可能是内存,所以下面实在内存中的读写操作 示例1: # -*- coding:utf-8 -*- #! python3 from io import StringIO f=StringIO() f.write('everything') f.write('is') f.write('possible') print(f.getvalue()) 运行结果: everythingispo

  • OpenCV cv.Mat与.txt文件数据的读写操作

    本篇文章主要介绍了OpenCV cv.Mat 与 .txt 文件数据的读写操作,小编觉得挺不错的,现在分享给大家. 1.按OpenCV格式实现的 .txt 文件读写 可以用 cvSave 和 cvLoad 实现,格式和 .xml/.yml 的差不多,不过如果专用与 OpenCV 的数据读写,还是用  .xml/.yml 文件格式较好,我比较喜欢 .yml 格式,可读性非常棒. 用 cvSave 和 cvLoad 读写 .txt 文件,其实现方式和数据格式与 .yml 文件基本一致. 例如:cvS

  • 对python for 文件指定行读写操作详解

    1.os.mknod("test.txt") #创建空文件 2.fp = open("test.txt",w) #直接打开一个文件,如果文件不存在则创建文件 3.关于open 模式: 详情: w:以写方式打开, a:以追加模式打开 (从 EOF 开始, 必要时创建新文件) r+:以读写模式打开 w+:以读写模式打开 (参见 w ) a+:以读写模式打开 (参见 a ) rb:以二进制读模式打开 wb:以二进制写模式打开 (参见 w ) ab:以二进制追加模式打开 (

  • Java对xls文件进行读写操作示例代码

    前言 本文主要给大家介绍的是关于Java对xls文件进行读写操作的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: win7_x64 IDEA Java读写xls文件,使用库jxl.jar 读写xls文件,这里是在知道表格格式的前提下进行操作的. 目前无法操作xlsx文件 准备工作 将库jxl.jar添加到工程依赖中 Java代码示例 示例:从几个文件中读取数据并汇总到一个文件中 表格中的数据规定为:首行为标题,以下是数据和名称:例如 单位名 金额 单位1 948.34

  • C语言 文件的随机读写详解及示例代码

    前面介绍的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据.但在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写.这种读写方式称为随机读写,也就是说从文件的任意位置开始读写. 实现随机读写的关键是要按要求移动位置指针,这称为文件的定位. 文件定位函数rewind和fseek 移动文件内部位置指针的函数主要有两个,即 rewind() 和 fseek(). rewind() 用来将位置指针移动到文件开头,前面已经多次使用过,它的原型为

  • python config文件的读写操作示例

    本文实例讲述了python config文件的读写操作.分享给大家供大家参考,具体如下: 1.设置配置文件 [mysql] host = 1234 port = 3306 user = root password = Zhsy08241128 database = leartd 2.读取配置文件 import configparser import os conf= configparser.ConfigParser() def readConf(): '''读取配置文件''' root_pat

  • AngularJS入门教程之Cookies读写操作示例

    本文实例讲述了AngularJS的Cookies读写操作.分享给大家供大家参考,具体如下: 虽然使用JavaScript创建和获取Cookie很简单,AngularJS还是把它作为一个单独的模块进行了封装,模块名为ngCookies,和前面的教程中做法一样,先引入angular-cookies.js: <script type="text/javascript" src="angular-1.3.0.14/angular-cookies.js"><

随机推荐