首页 > 其他分享 >30天学会Go--第4天 GO语言 错误处理与文件操作

30天学会Go--第4天 GO语言 错误处理与文件操作

时间:2024-12-03 11:01:48浏览次数:8  
标签:文件 err -- fmt 30 file Println 错误处理 os

30天学会Go–第4天 GO语言 错误处理与文件操作

文章目录

前言

在 Go 语言中,错误处理和文件操作是编写健壮程序的重要组成部分。Go 提供了简洁而强大的错误处理机制,以及丰富的标准库支持文件的读写操作。本节将通过理论与实践相结合的方式,带你快速掌握这两个关键主题。

go语言官方编程指南:https://pkg.go.dev/stdopen in new window

go语言的官方文档学习笔记很全,推荐去官网学习

30天学会GO–第3天 GO语言 并发编程:30天学会Go–第3天 GO语言 并发编程-CSDN博客


一、错误处理

Go 语言的错误处理采用了一种简单且直观的方式:通过函数的返回值来传递错误信息。Go 中没有异常,但有 error 类型,用于表示错误。

1.1 基本错误处理

Go 中的函数通常会返回两个值:结果值错误值。如果错误值为 nil,表示操作成功;否则表示操作失败。

示例代码
package main

import (
	"errors"
	"fmt"
)

func divide(a, b int) (int, error) {
	if b == 0 {
		// 返回错误信息
		return 0, errors.New("division by zero")
	}
	return a / b, nil
}

func main() {
	result, err := divide(10, 0)
	if err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println("Result:", result)
	}
}
运行结果
Error: division by zero

1.2 自定义错误

Go 允许我们通过实现 error 接口自定义错误类型,便于更灵活地处理错误。

示例代码
package main

import (
	"fmt"
)

// 自定义错误类型
type MyError struct {
	Code    int
	Message string
}

func (e *MyError) Error() string {
	return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
}

func doSomething() error {
	return &MyError{Code: 404, Message: "Resource not found"}
}

func main() {
	err := doSomething()
	if err != nil {
		fmt.Println(err)
	}
}
运行结果
Error 404: Resource not found

1.3 使用 panicrecover

Go 中的 panic 用于在程序遇到无法恢复的错误时中止程序执行,而 recover 则可以捕获 panic,防止程序崩溃。

示例代码
package main

import "fmt"

func mayPanic() {
	panic("Something went wrong!")
}

func main() {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recovered from panic:", r)
		}
	}()

	mayPanic()
	fmt.Println("This will not be printed if panic is not recovered")
}
运行结果
Recovered from panic: Something went wrong!

下面是代码的执行流程:

  1. main 函数开始执行。
  2. defer 注册了匿名函数,延迟执行。
  3. 调用mayPanic()
    • panic("Something went wrong!") 被触发。
    • 程序停止执行,并开始寻找 defer
  4. 执行defer中的匿名函数:
    • recover() 捕获了 panic,返回 "Something went wrong!"
    • 打印了 "Recovered from panic: Something went wrong!"
  5. main 函数的控制权直接返回,不会继续执行 mayPanic() 调用之后的代码。

因此,fmt.Println("This will not be printed if panic is not recovered") 没有被执行。


二、文件操作

Go 提供了 osio/ioutil 等标准库,支持文件的创建、读取、写入和删除等操作。

2.1 打开和关闭文件

使用 os.Open 打开文件,os.Close 关闭文件。

示例代码
package main

import (
	"fmt"
	"os"
)

func main() {
	file, err := os.Open("example.txt")
	if err != nil {
		fmt.Println("Error opening file:", err)
		return
	}
	defer file.Close()

	fmt.Println("File opened successfully")
}

2.2 读取文件内容

使用 osioutil 读取文件内容。

示例代码(逐行读取文件)
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	file, err := os.Open("example.txt")
	if err != nil {
		fmt.Println("Error opening file:", err)
		return
	}
	defer file.Close()

	scanner := bufio.NewScanner(file) // bufio.NewScanner(file): 一个用于读取数据的扫描器,支持按行或按自定义分隔符读取输入
	for scanner.Scan() {  // scanner.Scan() 是扫描器的核心方法,用于读取文件中的下一行数据
		fmt.Println(scanner.Text())
	}

	if err := scanner.Err(); err != nil { // scanner.Err() 会返回扫描过程中是否发生了错误
		fmt.Println("Error reading file:", err)
	}
}

2.3 写入文件

使用 os.Create 创建文件,WriteString 写入内容。

示例代码
package main

import (
	"fmt"
	"os"
)

func main() {
	file, err := os.Create("output.txt")
	if err != nil {
		fmt.Println("Error creating file:", err)
		return
	}
	defer file.Close()

	_, err = file.WriteString("Hello, Go!\n") // 第一个返回值是写入的字节数,第二个返回值是 error 类型,表示写入过程中是否发生了错误。
	if err != nil {
		fmt.Println("Error writing to file:", err)
		return
	}

	fmt.Println("File written successfully")
}

2.4 文件追加

使用 os.OpenFile 以追加模式打开文件。

示例代码
package main

import (
	"fmt"
	"os"
)

func main() {
	file, err := os.OpenFile("output.txt", os.O_APPEND|os.O_WRONLY, 0644)
	if err != nil {
		fmt.Println("Error opening file:", err)
		return
	}
	defer file.Close()

	_, err = file.WriteString("Appending some text.\n")
	if err != nil {
		fmt.Println("Error appending to file:", err)
		return
	}

	fmt.Println("File appended successfully")
}

func OpenFile(name string, flag int, perm os.FileMode) (*os.File, error)

flag 参数:

  • os.O_RDONLY:以只读模式打开文件。
  • os.O_WRONLY:以只写模式打开文件。
  • os.O_RDWR:以读写模式打开文件。
  • os.O_CREATE:如果文件不存在,则创建文件。
  • os.O_APPEND:以追加模式打开文件,写入的内容会追加到文件末尾。
  • os.O_TRUNC:如果文件存在,清空文件内容。

2.5 删除文件

使用 os.Remove 删除文件。

示例代码
package main

import (
	"fmt"
	"os"
)

func main() {
	err := os.Remove("output.txt")
	if err != nil {
		fmt.Println("Error deleting file:", err)
		return
	}

	fmt.Println("File deleted successfully")
}

2.6 文件和目录检查

使用 os.Stat 检查文件或目录是否存在。

示例代码
package main

import (
	"fmt"
	"os"
)

func main() {
	_, err := os.Stat("example.txt")
	if os.IsNotExist(err) {
		fmt.Println("File does not exist")
	} else {
		fmt.Println("File exists")
	}
}

三、 总结

  1. Go 的错误处理机制,包括基本错误处理、自定义错误、panicrecover
  2. 文件操作的常见场景,包括文件的打开、读取、写入、追加和删除。

标签:文件,err,--,fmt,30,file,Println,错误处理,os
From: https://blog.csdn.net/Xiao651/article/details/144207978

相关文章

  • 2024年版最详细Python下载安装+PyCharm下载安装使用教程!新手小白必看!
    2024年版最新Python下载安装+PyCharm下载安装使用教程!一、Python的下载安装访问官网选择版本下载安装包安装Python验证安装二、PyCharm的下载安装访问官网下载PyCharm安装PyCharm首次启动与配置三、PyCharm的基本使用创建Python文件编写代码运行代码安装第三方库配置Py......
  • BUU.Misc[zip伪加密]
    解压zip文件,发现加密了;题目提示伪加密,用010Editor打开文件:没有工具可看:010Editor下载安装和使用_010editor怎么改中文-CSDN博客伪加密Zip伪加密(保姆级解析-原创工具使用)-CSDN博客在了解后发现,zip的伪加密在ushortfrFlags和ushortdeFlags两块,:但本题两个地方都是09......
  • Java:174 基于SSM的萌宠宜家商城系统
    作者主页:舒克日记简介:Java领域优质创作者、Java项目、学习资料、技术互助文中获取源码项目介绍本系统分为管理员、用户两个角色管理员的主要功能:在后台主要管理收货地址管理、购物车管理、商品管理、商品收藏管理、商品评价管理、商品订单管理、字典管理、公告管理、......
  • Java:176 基于SSM在线购书商城系统
    作者主页:舒克日记简介:Java领域优质创作者、Java项目、学习资料、技术互助文中获取源码项目介绍系统分为管理员、用户两个角色用户的主要功能:查看系统信息、注册登录、在线客服、交流论坛、购物车、个人中心、我的发布、我的订单、我的地址、我的收藏管理员的主要功......
  • 在ArkTS中,如何优化布局以提高性能?
    大家好,我是V哥。在鸿蒙原生应用开发中,当一个复杂的界面加载数据或发生变化时,布局可能会发生调整,为了提高布局变化带来的性能问题,V哥在实际开发中,总结了一些优化技巧,来提高布局性能,笔记分享给大家。1.避免不必要的二次布局在Flex布局中,如果子组件的主轴尺寸总和不等于容器的......
  • Java:基于springboot的果蔬商城管理系统
    作者主页:IT小舟简介:Java领域优质创作者、Java项目、学习资料、技术互助文中获取源码项目介绍系统分为用户、管理员两个角色​主要适用于实体店的线上销售,打造线上线下一体化的销售模式,带动蔬菜的销售量,提高店铺的销售额。前台主要是登录注册、首页展示、分类搜索......
  • 简单异常处理器
    ExceptionController类packagecom.hkd.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.util.Arra......
  • 【金猿人物展】白鲸开源CEO郭炜:未来数据领域的PK是大模型Transformer vs 大数据Transf
    本文由白鲸开源CEO郭炜撰写并投递参与“数据猿年度金猿策划活动——2024大数据产业年度趋势人物榜单及奖项”评选。去年是大模型蓬勃兴起的一年,热度席卷全球,仿佛AI已经可以解决一切问题。今年随着热潮退去,大模型开始进入深水区,试图深入改造各行各业的底层逻辑。而在大数据处理......
  • 夜莺运维指南之基本部署
    对于一套监控系统而言,核心就是采集数据并存储,然后做告警判定、数据展示分析,整个流程图如下:1.夜莺服务端前置说明:各种环境的选型建议Dockercompose方式:可用于快速测试,不建议上生产,如果要生产环境使用Dockercompose,需要对Dockercompose真的很熟二进制部署:这是......
  • Notepad++ 轻量级跨平台文本编辑器,一款轻便且开源的文本与代码编辑器,备受资深用户的青
    一、概述Notepad++是一款免费开源的文本及源代码编辑器,兼容多种编程语言。这款软件在MSWindows操作系统上运行,并遵循GPL许可证发布。凭借其轻巧高效的特性,Notepad++赢得了众多开发者的青睐,成为他们的首选编辑工具。Notepad++由C++编写,因此性能卓越。它体积轻巧(完整安装包仅3......