【Go语言学习系列11】错误处理与异常

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

📚 原创系列: “Go语言学习系列”

🔄 转载说明: 本文最初发布于"Gopher部落"微信公众号,经原作者授权转载。

🔗 关注原创: 欢迎扫描文末二维码,关注"Gopher部落"微信公众号获取第一手Go技术文章。

📑 Go语言学习系列导航

本文是【Go语言学习系列】的第11篇,当前位于第一阶段(入门篇)

🚀 第一阶段:入门篇
  1. Go语言简介与环境搭建
  2. Go开发工具链介绍
  3. Go基础语法(一):变量与数据类型
  4. Go基础语法(二):流程控制
  5. Go基础语法(三):函数
  6. Go基础语法(四):数组与切片
  7. Go基础语法(五):映射
  8. Go基础语法(六):结构体
  9. Go基础语法(七):指针
  10. Go基础语法(八):接口
  11. 错误处理与异常 👈 当前位置
  12. 第一阶段项目实战:命令行工具

📚 查看完整Go语言学习系列导航

📖 文章导读

在本文中,您将学习:

  • Go错误处理的设计哲学与基本模式
  • error接口的深入理解与自定义错误类型
  • errors包与Go 1.13+错误包装功能
  • panic/recover机制及其适用场景
  • Go错误处理的高级模式与最佳实践
  • Go 1.20引入的多错误处理新特性

错误处理是Go程序设计的核心部分,与其他语言不同,Go使用显式错误返回而非异常机制作为主要错误处理方式。掌握Go的错误处理哲学和技巧,能帮助您编写更健壮、更可维护的代码。

Go错误处理机制


错误处理与异常机制完全指南

Go语言的错误处理机制独具特色,它将错误作为函数返回值显式处理,而不是使用传统的异常抛出和捕获模式。这种设计强调了错误处理的显式性和透明性,使开发者能够更清晰地理解和控制程序流程。本文将深入探讨Go的错误处理哲学、实现机制以及最佳实践。

一、Go错误处理的基础

1.1 错误处理哲学

Go语言的错误处理遵循几个核心原则:

  1. 显式优于隐式:错误必须被显式检查和处理
  2. 简单明了:使用简单的返回值而非复杂的异常机制
  3. 错误是值:错误在Go中是普通值,可以像其他值一样传递和操作
  4. 错误处理是正常控制流的一部分:而不是特殊路径

1.2 error接口

Go中的所有错误都满足内置的error接口:

type error interface {
    Error() string
}

这个简单的接口只有一个方法,用于返回错误描述字符串。任何实现了Error()方法的类型都可以作为错误使用。

1.3 基本错误处理模式

Go的标准错误处理模式是将错误作为函数的最后一个返回值:

func readFile(filename string) ([]byte, error) {
    f, err := os.Open(filename)
    if err != nil {
        return nil, err // 返回错误
    }
    defer f.Close()
    
    data, err := io.ReadAll(f)
    if err != nil {
        return nil, err
    }
    
    return data, nil // 成功时返回nil错误
}

func main() {
    data, err := readFile("config.json")
    if err != nil {
        fmt.Println("读取文件失败:", err)
        return
    }
    
    // 处理数据...
    fmt.Println("文件内容:", string(data))
}

这种模式的关键点是:

  • 使用多返回值,最后一个返回值为错误
  • 调用者必须显式检查错误
  • 错误的零值是nil,表示没有错误
  • 正常情况下返回实际结果和nil错误

二、创建和使用错误

2.1 创建简单错误

Go提供了多种创建错误的方式:

// 使用errors.New创建简单错误
import "errors"

err1 := errors.New("数据库连接失败")

// 使用fmt.Errorf创建格式化错误
import "fmt"

name := "config.json"
err2 := fmt.Errorf("找不到文件: %s", name)

2.2 自定义错误类型

对于需要携带额外信息的错误,可以创建自定义错误类型:

// 定义自定义错误类型
type QueryError struct {
    Query string
    Err   error
}

// 实现error接口
func (e *QueryError) Error() string {
    return fmt.Sprintf("查询 %q 失败: %v", e.Query, e.Err)
}

// 使用自定义错误
func executeQuery(query string) error {
    // ...
    return &QueryError{
        Query: query,
        Err:   errors.New("数据库连接超时"),
    }
}

// 使用类型断言检查具体错误类型
func handleQuery() {
    err := executeQuery("SELECT * FROM users")
    if err != nil {
        if qErr, ok := err.(*QueryError); ok {
            fmt.Printf("查询错误: %s, 原始错误: %v\n", 
                       qErr.Query, qErr.Err)
        } else {
            fmt.Println("其他错误:", err)
        }
    }
}

自定义错误类型的优势:

  • 可以携带上下文信息
  • 允许调用者通过类型断言获取详细信息
  • 可以实现错误分层和包装

2.3 错误包装(Go 1.13+)

Go 1.13引入了错误包装功能,通过fmt.Errorf结合%w谓词实现:

// 包装错误
originalErr := errors.New("数据库连接失败")
wrappedErr := fmt.Errorf("执行查询时出错: %w", originalErr)

// 解包错误
fmt.Println(wrappedErr) // 执行查询时出错: 数据库连接失败

// 使用errors.Unwrap获取原始错误
if errors.Unwrap(wrappedErr) == originalErr {
    fmt.Println("原始错误被正确识别")
}

// 使用errors.Is检查错误链中是否包含特定错误
if errors.Is(wrappedErr, originalErr) {
    fmt.Println("错误链中包含原始错误")
}

// 使用errors.As获取错误链中的特定类型
var queryErr *QueryError
if errors.As(wrappedErr, &queryErr) {
    fmt.Println("找到QueryError类型错误")
}

错误包装的优势:

  • 保留错误上下文和链条
  • 允许检查错误链中的特定错误
  • 提供更丰富的错误信息

三、错误处理策略与模式

3.1 仅处理一次错误

一个好的原则是每个错误只处理一次。处理错误意味着:

  • 修复错误并继续
  • 将错误包装并向上传播
  • 记录错误并停止处理

不良实践是既记录又返回同一个错误:

// 不推荐的方式
func processFile(filename string) error {
    data, err := ioutil.ReadFile(filename)
    if err != nil {
        log.Printf("读取文件失败: %v", err) // 记录错误
        return err                      // 又返回错误
    }
    // ...
}

// 推荐的方式
func processFile(filename string) error {
    data, err := ioutil.ReadFile(filename)
    if err != nil {
        return fmt.Errorf("读取文件 %s 失败: %w", filename, err)
    }
    // ...
}

// 或者如果这是调用链的终点
func handleRequest() {
    err := processFile("config.json")
    if err != nil {
        log.Printf("请求处理失败: %v", err)
        http.Error(w, "内部服务器错误", 500)
        return
    }
    // ...
}

3.2 错误处理模式

几种常见的错误处理模式:

哨兵错误(Sentinel Errors)

预定义特定错误值用于比较:

var (
    ErrNotFound = errors.New("资源未找到")
    ErrPermission = errors.New("权限不足")
)

func GetResource(id string) (*Resource, error) {
    // ...
    return nil, ErrNotFound
}

// 使用
res, err := GetResource("123")
if err == ErrNotFound {
    // 处理"未找到"情况
}
错误类型检查

通过类型断言或errors.As检查错误类型:

type NotFoundError struct {
    Resource string
}

func (e NotFoundError) Error() string {
    return fmt.Sprintf("资源 %s 未找到", e.Resource)
}

// 使用
if err != nil {
    var notFound NotFoundError
    if errors.As(err, &notFound) {
        // 处理NotFoundError
    }
}
错误行为检查(Go 1.20+)

检查错误是否实现了特定接口,关注错误能做什么,而非错误是什么:

// 定义行为接口
type Temporary interface {
    Temporary() bool
}

// 实现接口的错误
type NetworkError struct {
    Msg string
    IsTemp bool
}

func (e NetworkError) Error() string {
    return e.Msg
}

func (e NetworkError) Temporary() bool {
    return e.IsTemp
}

// 基于行为处理错误
func handleConnection() {
    for {
        err := connect()
        if err != nil {
            // 检查错误行为
            var temp interface{ Temporary() bool }
            if errors.As(err, &temp) && temp.Temporary() {
                // 临时错误,稍后重试
                time.Sleep(time.Second)
                continue
            }
            // 永久错误,停止尝试
            log.Fatalf("连接失败: %v", err)
        }
        break
    }
}

3.3 Go 1.20多错误处理

Go 1.20引入了errors.Join函数,用于组合多个错误:

// 组合多个错误
err1 := errors.New("错误1")
err2 := errors.New("错误2")
err3 := errors.New("错误3")

combinedErr := errors.Join(err1, err2, err3)
fmt.Println(combinedErr) // 错误1
                        // 错误2
                        // 错误3

// 检查组合错误中是否包含特定错误
if errors.Is(combinedErr, err2) {
    fmt.Println("组合错误包含err2")
}

这在需要报告多个独立失败的场景中非常有用,如清理资源或批量操作。

四、panic与recover机制

4.1 panic基础

panic是Go中的异常机制,用于处理不可恢复的错误:

func divide(a, b int) int {
    if b == 0 {
        panic("除数不能为零")
    }
    return a / b
}

当调用panic时:

  1. 当前函数执行立即停止
  2. 任何defer语句正常执行
  3. 控制权返回给调用者
  4. 过程递归向上,直到程序崩溃或被recover捕获

4.2 recover捕获panic

recover允许程序捕获panic并恢复正常执行:

func safeOperation() (err error) {
    defer func() {
        if r := recover(); r != nil {
            // 将panic转换为错误返回
            switch x := r.(type) {
            case string:
                err = errors.New(x)
            case error:
                err = x
            default:
                err = fmt.Errorf("未知panic: %v", r)
            }
        }
    }()
    
    // 可能引发panic的操作
    result := riskyOperation()
    return nil
}

func main() {
    if err := safeOperation(); err != nil {
        fmt.Println("操作失败:", err)
    }
}

recover只在defer函数内部有效,在其他地方调用不会捕获panic。

4.3 panic/recover适用场景

panic/recover应该仅用于以下场景:

  1. 真正的异常情况:如不可恢复的逻辑错误
  2. 初始化失败:程序启动时如果关键初始化失败
  3. 防止程序崩溃:作为最后的保护机制
  4. 简化复杂错误处理:在特定递归场景中,如解析器实现

不适合用于:

  • 常规错误处理(使用错误返回值)
  • 预期可能的失败(如文件不存在)
  • 控制流程的一般手段

4.4 小心隐藏的panic

某些操作可能会引发隐藏的panic,应小心处理:

// 可能引发panic的操作
var users []User
fmt.Println(users[0])      // 索引越界
var m map[string]int
m["key"] = 1               // nil map赋值
var p *Person
fmt.Println(p.Name)        // 空指针解引用

// 安全的替代方案
if len(users) > 0 {
    fmt.Println(users[0])
}

m := make(map[string]int)
m["key"] = 1

if p != nil {
    fmt.Println(p.Name)
}

五、实践应用

5.1 错误处理中间件

在Web应用中,可以使用中间件统一处理错误:

// 错误处理中间件
func ErrorHandlingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 使用自定义ResponseWriter捕获状态码
        rw := &responseWriter{ResponseWriter: w, statusCode: http.StatusOK}
        
        // 使用recover捕获panic
        defer func() {
            if err := recover(); err != nil {
                // 记录错误
                log.Printf("请求处理panic: %v", err)
                
                // 返回500错误
                http.Error(rw, "Internal Server Error", http.StatusInternalServerError)
            }
        }()
        
        // 调用下一个处理器
        next.ServeHTTP(rw, r)
        
        // 检查是否有错误需要处理
        if rw.err != nil {
            // 根据错误类型返回适当的响应
            switch {
            case errors.Is(rw.err, ErrNotFound):
                http.Error(rw, "Resource not found", http.StatusNotFound)
            case errors.Is(rw.err, ErrUnauthorized):
                http.Error(rw, "Unauthorized", http.StatusUnauthorized)
            case errors.Is(rw.err, ErrValidation):
                http.Error(rw, rw.err.Error(), http.StatusBadRequest)
            default:
                // 记录未知错误
                log.Printf("未处理的错误: %v", rw.err)
                http.Error(rw, "Internal Server Error", http.StatusInternalServerError)
            }
        }
    })
}

// 自定义ResponseWriter
type responseWriter struct {
    http.ResponseWriter
    statusCode int
    err        error
}

func (rw *responseWriter) WriteHeader(code int) {
    rw.statusCode = code
    rw.ResponseWriter.WriteHeader(code)
}

// 设置错误
func (rw *responseWriter) SetError(err error) {
    rw.err = err
}

// 使用示例
func main() {
    mux := http.NewServeMux()
    
    // 添加路由
    mux.HandleFunc("/users", handleUsers)
    
    // 应用中间件
    handler := ErrorHandlingMiddleware(mux)
    
    // 启动服务器
    log.Fatal(http.ListenAndServe(":8080", handler))
}

func handleUsers(w http.ResponseWriter, r *http.Request) {
    // 获取ResponseWriter
    rw := w.(*responseWriter)
    
    // 处理请求...
    userID := r.URL.Query().Get("id")
    if userID == "" {
        rw.SetError(ErrValidation)
        return
    }
    
    user, err := getUser(userID)
    if err != nil {
        if errors.Is(err, ErrNotFound) {
            rw.SetError(ErrNotFound)
        } else {
            rw.SetError(err)
        }
        return
    }
    
    // 返回结果
    json.NewEncoder(w).Encode(user)
}

5.2 错误分类与处理策略

根据错误的性质采用不同的处理策略:

// 错误类型
var (
    ErrNotFound     = errors.New("资源不存在")
    ErrUnauthorized = errors.New("未授权访问")
    ErrValidation   = errors.New("输入验证失败")
    ErrTimeout      = errors.New("操作超时")
    ErrInternal     = errors.New("内部错误")
)

// 错误分类
type ErrorCategory int

const (
    ErrorCategoryClient ErrorCategory = iota // 客户端错误
    ErrorCategoryServer                      // 服务器错误
    ErrorCategoryExternal                    // 外部服务错误
)

// 带分类的错误
type CategorizedError struct {
    err      error
    category ErrorCategory
}

func (e *CategorizedError) Error() string {
    return e.err.Error()
}

func (e *CategorizedError) Unwrap() error {
    return e.err
}

func (e *CategorizedError) Category() ErrorCategory {
    return e.category
}

// 创建分类错误
func NewCategorizedError(err error, category ErrorCategory) error {
    return &CategorizedError{
        err:      err,
        category: category,
    }
}

// 错误处理策略
func handleError(err error) {
    var catErr *CategorizedError
    if errors.As(err, &catErr) {
        switch catErr.Category() {
        case ErrorCategoryClient:
            // 客户端错误,记录警告并返回友好消息
            log.Printf("客户端错误: %v", err)
            // 返回用户友好的错误消息
            
        case ErrorCategoryServer:
            // 服务器错误,记录错误并返回通用错误消息
            log.Printf("服务器错误: %v", err)
            // 返回通用错误消息
            
        case ErrorCategoryExternal:
            // 外部服务错误,记录错误并可能重试
            log.Printf("外部服务错误: %v", err)
            // 实现重试逻辑
            
        default:
            // 未知错误类别
            log.Printf("未知错误: %v", err)
        }
    } else {
        // 未分类错误
        log.Printf("未分类错误: %v", err)
    }
}

5.3 错误恢复与优雅降级

实现错误恢复和优雅降级机制:

// 带重试的操作
func withRetry(operation func() error, maxRetries int, backoff time.Duration) error {
    var err error
    for i := 0; i < maxRetries; i++ {
        err = operation()
        if err == nil {
            return nil
        }
        
        // 检查是否是可重试的错误
        if !isRetryableError(err) {
            return err
        }
        
        // 等待一段时间后重试
        time.Sleep(backoff * time.Duration(i+1))
    }
    
    return fmt.Errorf("操作失败,已重试%d次: %w", maxRetries, err)
}

// 判断错误是否可重试
func isRetryableError(err error) bool {
    // 网络超时错误可重试
    if errors.Is(err, ErrTimeout) {
        return true
    }
    
    // 临时性错误可重试
    var tempErr interface{ Temporary() bool }
    if errors.As(err, &tempErr) && tempErr.Temporary() {
        return true
    }
    
    return false
}

// 优雅降级
func withFallback(primary func() (interface{}, error), fallback func() (interface{}, error)) (interface{}, error) {
    result, err := primary()
    if err == nil {
        return result, nil
    }
    
    // 主操作失败,尝试降级操作
    log.Printf("主操作失败,尝试降级: %v", err)
    return fallback()
}

// 使用示例
func fetchUserData(userID string) (*User, error) {
    // 尝试从主数据库获取
    primary := func() (interface{}, error) {
        return getUserFromPrimaryDB(userID)
    }
    
    // 降级到缓存
    fallback := func() (interface{}, error) {
        return getUserFromCache(userID)
    }
    
    result, err := withFallback(primary, fallback)
    if err != nil {
        return nil, err
    }
    
    return result.(*User), nil
}

👨‍💻 关于作者与Gopher部落

"Gopher部落"专注于Go语言技术分享,致力于为开发者提供从入门到精通的完整学习路线。我们提供:

  • 📚 系统化的Go语言学习教程
  • 🔥 最新Go生态技术动态
  • 💡 实用开发技巧与最佳实践
  • 🚀 大厂项目实战经验分享

🎁 读者福利

关注"Gopher部落"微信公众号,即可获得:

  1. 完整Go学习路线图:从入门到高级的完整学习路径
  2. 面试题集锦:精选Go语言面试题及答案解析
  3. 项目源码:实战项目完整源码及详细注释
  4. 个性化学习计划:根据你的水平定制专属学习方案

如果您觉得这篇文章有帮助,请点赞、收藏并关注,这是对我们最大的支持!

Golanggo语言异常处理快速学习 Go语言常见的异常处理知识大全,快速入门学习,形成整体知识架构,在实际中应用分析go语言异常处理的机制 阅读详情

相关推荐

Go语言学习系列02】Go开发工具链介绍

全面解析Go语言工具链,掌握go build、go fmt、go test等必备命令,快速提升Go开发效率代码质量

GopherTribe的博客 1585

Go语言(golang)的错误(error)处理的方案

对于Go语言(golang)的错误设计,相信很多人已经体验过了,它是通过返回值的方式,来强迫调用者对错误进行处理,要么你忽略,要么你处理(处理也可以是继续返回给调用者),对于golang这种设计方式,我们会在代码中写大量的if判断,以便做出决定。 func main() { conent,err:=ioutil.ReadFile("filepath") if err !=nil{ //错误...

yonggeit的博客 1万+

Go语言学习系列10】Go基础语法(八):接口

深入解析Go语言接口的工作原理、类型断言实战应用技巧,掌握这一强大的抽象机制,提升代码灵活性可维护性

GopherTribe的博客 1136

Go-错误、异常处理详解_or volume label syntax is incorrect

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。//-----------获取err信息------------//不在defer中使用recover是没有意义的。//----------嵌套error,标明位置。// 记录错误发生的文件和函数。因篇幅有限,仅展示部分资料。// error统一定义。// 使用panic。// 计算正整数除法。// 使用panic。

2401_84253850的博客 556

Golang——20_错误处理

20 错误处理        Go 语言通过内置的错误接口提供了非常简单的错误处理机制。        error类型是一个接口类型,这是它的定义:type error interface { Error() string }        我们可以在编码中通过实现 error 接口类型来生成错误信息。        函数通常在最后的返回值中返回错误信息。使用errors.New 可返回一...

u012869599的博客 537

go 异常处理

panic-recover机制 go中不像其它语言有try catch语法,同样也不推荐捕获异常而是推荐采用将异常返回的方式。但是对于一些会导致程序崩溃的严重异常,直接退出也会比层层返回方便的多。因此go中实现了panic-recover机制,专门用于对这些异常进行抛出和恢复。 在语义上,try catch更像尝试性的去做一些事,在这期间如果发生错误,则如何如何。而panic则是告诉你程序奔溃了,发生了特别严重的故障,到了难以恢复的程度。recover则是看看能不能救回来,如果不是极其致命,那么就继续服务吧

衡与墨的博客 3173

go学习(十二)——Go 语言错误异常处理机制

错误处理error接口defer--延迟语句 例子1:defer语句加载时记录值例子2:在函数返回后执行例子3:defer语句会读取主调函数的返回值,并对返回值赋值.(注意和例子2的区别) panic-recover运行时异常处理机制 panic()recover() 写在前面:  近来关于对Golang的讨论有很多,七牛的几个大牛们也断定Go语言在未来将会快速发展,这里

天天water的专栏 6933

Golang语言异常机制解析:错误策略优雅处理

本文深入探讨了Go语言的错误策略异常机制。作者:鼠鼠我捏,要死了捏

qq_35716689的博客 39万+

Go语言学习系列00】Go语言学习系列导航

本文是Go语言学习系列的导航文档,提供了从入门到精通的学习路径,包含各阶段文章链接和内容概述,帮助读者系统化学习Go语言。

GopherTribe的博客 1562

【新人系列Golang 入门(十):错误处理详解 - 上

📣 专栏定位:为 0 基础刚入门 Golang 的小伙伴提供详细的讲解,也欢迎大佬们一起交流~📚 专栏简介:在这个专栏,我将带着大家从 0 开始入门 Golang学习。在这个 Golang 的新人系列专栏下,将会总结 Golang 入门基础的一些知识点,并由浅入深的学习这些知识点,方便大家快速入门学习~

Newin2020的博客 1874

Go语言学习系列01】Go语言简介环境搭建

深入了解Go语言的设计理念特点,掌握Windows/Mac/Linux全平台环境搭建,开启Go语言学习之旅

GopherTribe的博客 1257

100天精通Golang(基础入门篇)——第23天:错误处理的艺术: Go语言实战指南

错误通常指的是预期可能会出现问题的地方确实出现了问题。例如,当尝试打开一个文件失败时,这种情况通常是可以预料到的。异常则是指在不应出现问题的地方却出现了问题。例如,发生了空指针引用,这种情况通常是出乎人们的意料之外的。从这可以看出,错误通常是业务过程的一部分,而异常则不是。创建自定义错误可以使用errors包下的New()函数,以及fmt包下的:Errorf()函数。//errors包://fmt包:在使用New()函数创建自定义错误之前,让我们了解它是如何实现的。下面提供了错误包中的新功能的实现。

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:CSDNWF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 5万+

一文搞懂Go语言错误处理异常捕获、异常抛出】

介绍了go语言错误处理,以及创建错误对象,模拟异常的捕获。精简的代码实现硕大的功能。^_^在这里你会找到你想要的答案。

一个非常Cool的人 2088

go每日一题】golang异常、错误 {源码、实践、总结}

Go错误处理设计其他语言的异常不同。Go 中的 error 就是一个普通的值对象,而其他语言如 Java 中的 Exception 将会造成程序控制流的终止和其他行为,Exception 普通的值不同。虽然 Go 也有类似的异常机制 —— panic,但它仅用于报告完全无法预料的错误(可能有 Bug),而不应该是一个健壮程序应该返回的程序错误(这一点 Java 等语言不同)。 在我们最常用的函数返回值类型就是这个接口类型 Goerror 设计为一个接口,只需要实现 Error() stri

YiGeiGiaoGiao的博客 1138

Golang Web框架错误处理:优雅应对各种异常情况

本文旨在全面系统地介绍Golang Web开发中的错误处理机制,帮助开发者理解并掌握在Web应用中处理各种异常情况的最佳实践。Golang错误处理的基本原理主流Web框架的错误处理机制对比中间件在错误处理中的应用自定义错误类型和错误封装性能优化和错误处理的关系实际项目中的错误处理策略本文采用由浅入深的结构,首先介绍Golang错误处理的基础知识,然后深入探讨Web框架中的错误处理机制,最后提供实际项目中的应用案例和最佳实践。背景介绍:明确文章范围和目标读者。

AI Agent Harness Engineering 1267

Go语言学习系列06】Go基础语法(四):数组切片

深入解析Go语言数组切片的底层原理,通过实例讲解内存布局、扩容机制性能优化技巧,掌握这两种核心数据结构的高效使用方法

GopherTribe的博客 1038

golang 错误处理

带你熟悉golang error相关的知识. 0.引言 在这篇文章中,我会带你熟悉golang error相关的知识,大概内容如下: golang error和其他语言的对比,好处弊端golang 中各种类型的错误以及推荐的错误类型如何处理错误对go1.13的错误包进行解析对golang error相关知识进行总结、梳理思考题 如果本文中有任何的错误、或者你有一些好的想法都可以及时的提出,希望我们共同进步。 注:本文中的所有代码都在:https://github.com/driftingboy/ad

qq_40653180的博客 5367

Go必知必会系列异常处理错误处理

作者:禅计算机程序设计艺术 1.背景介绍 随着编程语言的发展和应用范围的扩大,程序员需要处理的问题越来越复杂,为了更好地处理这些问题,出现了异常处理和错误处理的机制。在Go语言中,异常处理和错误处理是非常重要的一部分。 本文将介绍Go语言中的异常处理和错误处理的核心概念、核心算法原理和具体

AI天才研究院 284

简单介绍Go语言错误处理异常捕获+异常抛出

这篇文章主要介绍了Go语言错误处理异常捕获和异常抛出,Go语言的作者认为java等语言的错误处理底层实现较为复杂,就实现了函数可以返回错误类型以及简单的异常捕获,虽然简单但是也非常精妙,大大的提高了运行效率,下文需要的朋友可以参考一下 Go 语言追求简洁优雅,所以,Go 语言不支持传统的 try…catch…finally 这种处理。 Go 中引入的错误处理方式为:defer, panic, recover,也仅仅是错处处理的模拟 Go语言的作者认为java等语言的错误处理底层实现较为复杂,就实现了

Free雅轩的博客 3264
上一篇: 【Go语言学习系列10】Go基础语法(八):接口
下一篇: 【Go语言学习系列12】第一阶段项目实战:命令行工具
Gopher部落
博客等级 码龄1年 784粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gopher部落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值