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 使用 panic
和 recover
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!
下面是代码的执行流程:
main
函数开始执行。defer
注册了匿名函数,延迟执行。- 调用
mayPanic()
:panic("Something went wrong!")
被触发。- 程序停止执行,并开始寻找
defer
。
- 执行
defer
中的匿名函数:recover()
捕获了panic
,返回"Something went wrong!"
。- 打印了
"Recovered from panic: Something went wrong!"
。
main
函数的控制权直接返回,不会继续执行mayPanic()
调用之后的代码。
因此,fmt.Println("This will not be printed if panic is not recovered")
没有被执行。
二、文件操作
Go 提供了 os
和 io/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 读取文件内容
使用 os
或 ioutil
读取文件内容。
示例代码(逐行读取文件)
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")
}
}
三、 总结
- Go 的错误处理机制,包括基本错误处理、自定义错误、
panic
和recover
。 - 文件操作的常见场景,包括文件的打开、读取、写入、追加和删除。
标签:文件,err,--,fmt,30,file,Println,错误处理,os From: https://blog.csdn.net/Xiao651/article/details/144207978