Go语言学习笔记【4】 文件操作、MVC框架

【声明】

非完全原创,部分内容来自于学习其他人的理论和B站视频。如果有侵权,请联系我,可以立即删除掉。

一、文件操作

1、os包相关的方法

1.1、创建、打开、关闭文件

func Create(name string) (file *File, err error)
//Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错,错误底层类型是*PathError。

func NewFile(fd uintptr, name string) *File
//根据文件描述符创建相应的文件,返回一个文件对象

func Open(name string) (file *File, err error)
//Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。内部实现其实调用了OpenFile。

func OpenFile(name string, flag int, perm uint32) (file *File, err error)
//OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。
//打开名称为name的文件,flag是打开的方式,只读、读写等,perm是权限

const (
    O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
    O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
    O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
    O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
    O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
    O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
    O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
    O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
)

func (f *File) Close() error
//Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。

1.2、写文件

func (file *File) Write(b []byte) (n int, err error)
//Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误

func (file *File) WriteAt(b []byte, off int64) (n int, err error)
//WriteAt在指定的位置(相对于文件开始位置)写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。

func (file *File) WriteString(s string) (ret int, err error)
//WriteString类似Write,但接受一个字符串参数。

1.3、读文件

func (file *File) Read(b []byte) (n int, err error)
//Read方法从f指针中读取最多len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。文件终止标志是读取0个字节且返回值err为io.EOF。

func (file *File) ReadAt(b []byte, off int64) (n int, err error)
//ReadAt从指定的位置(相对于文件开始位置)读取len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。当n<len(b)时,本方法总是会返回错误;如果是因为到达文件结尾,返回值err会是io.EOF。

1.4、删除文件

func Remove(name string) error
//Remove删除name指定的文件或目录。如果出错,会返回*PathError底层类型的错误。

func RemoveAll(path string) error
//RemoveAll删除path指定的文件,或目录及它包含的任何下级对象。它会尝试删除所有东西,除非遇到错误并返回。如果path指定的对象不存在,RemoveAll会返回nil而不返回错误。

2、其他包的方法

2.1 bufio包相关方法

func NewReader(rd io.Reader) *Reader
//NewReader创建一个具有默认大小缓冲、从r读取的*Reader。

func (b *Reader) ReadString(delim byte) (line string, err error)
//ReadString读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的字符串。

func NewWriter(w io.Writer) *Writer
//NewWriter创建一个具有默认大小缓冲、写入w的*Writer。

func (b *Writer) Write(p []byte) (nn int, err error)
//Write将p的内容写入缓冲。返回写入的字节数。如果返回值nn < len(p),还会返回一个错误说明原因。

func (b *Writer) WriteString(s string) (int, error)
//WriteString写入一个字符串。返回写入的字节数。如果返回值nn < len(s),还会返回一个错误说明原因。

func (b *Writer) Flush() error
//Flush方法将缓冲中的数据写入下层的io.Writer接口。一般写入数据后需要调用该函数将数据刷到文件中

2.2 io.ioutil

func ReadAll(r io.Reader) ([]byte, error)
//ReadAll从r读取数据直到EOF或遇到error,返回读取的数据和遇到的错误。

func ReadFile(filename string) ([]byte, error)
//ReadFile 从filename指定的文件中读取数据并返回文件的内容。成功的调用返回的err为nil而非EOF。

func WriteFile(filename string, data []byte, perm os.FileMode) error
//函数向filename指定的文件中写入数据。如果文件不存在将按给出的权限创建文件,否则在写入数据之前清空文件。

3、基本使用

3.1、读写文件内容

func main() {
   
	//以读写模式打开文件,文件不存在则创建
	path := "D:/data.txt"
	file, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0755)
	defer file.Close()
	if err != nil {
   
		fmt.Println("文件以读写模式打开失败, err = ", err)
	}

	str := "Hello world\nHello ketty\nhello golang\n"
	bytes, err := file.Write([]byte(str))
	if err != nil {
   
		fmt.Println("文件指针写数据失败, err = ", err)
	}
	fmt.Printf("文件指针写入了[%d]字节\n", bytes)

	//file指针写完数据之后,指向了文件末尾
	//如果不重新移位,则后面的reader第一次就读到了EOF
	offset, err := file.Seek(0, io.SeekStart)
	if err != nil {
   
		fmt.Println("文件指针移位到文件头部位置失败, err = ", err)
	}
	fmt.Printf("文件指针移位到文件头部位置成功, offset = %d\n\n", offset)

	//file, _ = os.Open(path)
	//根据文件指针创建一个reader,从文件中读数据
	reader := bufio.NewReader(file)
	for {
   
		line, err := reader.ReadString('\n')
		if err != nil {
   
			fmt.Println("bufio.Reader指针读取一行数据失败, err = ", err)
			break
		}
		fmt.Printf("%s", line) //line自带换行符
	}

	//根据文件路径,直接一次性读取所有内容,该方法封装了Open和Close方法
	content, err := ioutil.ReadFile(path)
	if err != nil {
   
		fmt.Println("ioutil.ReadFile读数据失败, err = ", err)
	}
	fmt.Printf("ioutil.ReadFile读取了[%d]字节: %s\n", len(content), string(content))
}

output:
文件指针写入了[37]字节
文件指针移位到文件头部位置成功, offset =  0
Hello world
Hello ketty
hello golang
bufio.Reader指针读取一行数据失败, err =  EOF
ioutil.ReadFile读取了[37]字节: Hello world
Hello ketty
hello golang

3.2、写文件的三种方式

func main() {
   
	path := "D:/data2.txt"
	str := "Hello, golang\n"
	err := ioutil.WriteFile(path, []byte(str), os.ModePerm)
	if err != nil {
   
		fmt.Println("ioutil.WriteFile写数据失败, err = ", err)
	}

	file, err := os.OpenFile(path, os.O_RDWR|os.O_APPEND, 0777)
	if err != nil {
   
		fmt.Println("文件以读写模式打开失败, err = ", err)
	}
	str = "Hello, world\n"
	for i := 0; i < 3; i++ {
   
		_, err 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言学习笔记.pdf》是一本关于Go语言学习学习笔记,内容丰富且简洁明了。本书从基础知识开始,逐步介绍了Go语言的语法、特性和常用库函数等。在学习笔记中,作者通过实际的示例和练习帮助读者理解Go语言的概念和用法。 第一章介绍了Go语言的起源和发展,为读者提供了对Go语言背景的整体了解。第二章讲解了Go语言的基本语法,例如变量声明、循环和条件语句等。通过大量的代码示例,读者能够更好地理解Go语言的语法和结构。 接下来的章节重点介绍了Go语言的并发编程和高级特性。第三章详细介绍了Go语言中的goroutine和channel,这是Go语言并发编程的核心机制。作者通过生动的示例代码和实际应用案例,向读者展示了如何使用goroutine和channel实现并发编程。 第四章和第五章分别介绍了Go语言中的面向对象编程和函数式编程。通过深入讲解Go语言中的结构体、接口和函数,读者能够更好地应用这些特性进行代码设计和开发。 最后几章则介绍了Go语言中常用的库函数和工具。例如,第六章介绍了Go语言中用于网络编程的net包和http包。读者可以学习到如何使用这些库函数构建基于网络的应用程序。 总的来说,《Go语言学习笔记.pdf》是一本非常实用的Go语言学习资料。通过阅读这本书,读者能够系统地学习和理解Go语言的基本概念和高级特性,为之后的Go语言开发打下坚实的基础。无论是初学者还是有一定编程经验的开发者,都能从中获得丰富的知识和经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值