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

这篇博客介绍了Go语言中的文件操作,包括创建、打开、关闭、写入、读取和删除文件,以及文件拷贝和字符统计。同时,深入探讨了MVC框架的应用,阐述了MVC各部分的职责,以及在一个用户信息管理系统中的具体实现,包括模型、控制器和视图的详细设计和测试结果。
摘要由CSDN通过智能技术生成

【声明】

非完全原创,部分内容来自于学习其他人的理论和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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值