Golang 標準庫errors用法

Go語言的標準庫中的errors包提供了一些用于創建和操作錯誤的基本功能。下面是對該包的詳細用法說明。

基本用法

  1. 創建錯誤

    使用errors.New函數創建一個新的錯誤對象。errors.New接受一個字符串參數作為錯誤信息,并返回一個實現了error接口的對象。

    package mainimport ("errors""fmt"
    )func main() {err := errors.New("這是一個錯誤")fmt.Println(err) // 輸出: 這是一個錯誤
    }
    
  2. 使用fmt.Errorf格式化錯誤

    fmt包也提供了一個創建錯誤的方法——fmt.Errorf,它可以接收格式化字符串,并返回一個實現了error接口的對象。

    package mainimport ("fmt"
    )func main() {num := 42err := fmt.Errorf("發生錯誤,數字是 %d", num)fmt.Println(err) // 輸出: 發生錯誤,數字是 42
    }
    

自定義錯誤類型

除了直接使用errors.New創建的簡單錯誤對象外,通常我們會定義自己的錯誤類型,以便在程序中更好地處理錯誤。自定義錯誤類型需要實現error接口,即定義一個返回字符串的Error()方法。

package mainimport ("fmt"
)// MyError 結構體定義了一個自定義錯誤類型
type MyError struct {Msg stringCode int
}// Error 方法讓 MyError 實現了 error 接口
func (e *MyError) Error() string {return fmt.Sprintf("錯誤代碼 %d: %s", e.Code, e.Msg)
}func main() {err := &MyError{Msg: "自定義錯誤消息",Code: 500,}fmt.Println(err) // 輸出: 錯誤代碼 500: 自定義錯誤消息
}

錯誤鏈

從Go 1.13開始,標準庫引入了錯誤鏈的概念,允許將多個錯誤鏈接在一起形成一個鏈表結構。通過fmt.Errorf函數和%w動詞來包裝另一個錯誤,從而形成新的錯誤鏈。

package mainimport ("errors""fmt"
)func firstLevelError() error {return errors.New("第一級錯誤")
}func secondLevelError() error {err := firstLevelError()// 使用 %w 包裝底層錯誤return fmt.Errorf("第二級錯誤: %w", err)
}func thirdLevelError() error {err := secondLevelError()// 繼續包裝上一級錯誤return fmt.Errorf("第三級錯誤: %w", err)
}func main() {err := thirdLevelError()fmt.Println(err) // 輸出: 第三級錯誤: 第二級錯誤: 第一級錯誤// 使用 errors.Unwrap 解包最底層的錯誤unwrappedErr := errors.Unwrap(err)fmt.Println(unwrappedErr) // 輸出: 第二級錯誤: 第一級錯誤// 使用 errors.Is 判斷錯誤是否包含指定的錯誤類型isMatch := errors.Is(err, firstLevelError())fmt.Println(isMatch) // 輸出: true
}

使用errors.As判斷錯誤類型

如果有一個錯誤鏈,并且你想找到特定類型的錯誤,可以使用errors.As函數進行類型斷言檢查。

package mainimport ("errors""fmt"
)type CustomError struct {Message string
}func (e *CustomError) Error() string {return e.Message
}func someFunction() error {return &CustomError{Message: "自定義錯誤信息"}
}func main() {err := someFunction()var customErr *CustomErrorif errors.As(err, &customErr) {fmt.Printf("找到了自定義錯誤: %v\n", customErr)} else {fmt.Println("沒有找到自定義錯誤")}
}

以上是關于Go語言errors標準庫的一些基本用法和高級特性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86889.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86889.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86889.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

搭建自己的WEB應用防火墻

搭建自己的WEB應用防火墻 之前給客戶搭建的網站服務近期頻繁遭受惡意掃描、暴力破解攻擊,日志里記錄著各種奇葩的請求地址,導致Tomcat線程資源耗盡,最終nginx報504(網關超時),在服務器上curl本地請求依然卡…

MySQL:CRUD操作

目錄 XML模版一、結果返回集二、查詢三、查詢詳情四、新增4.1 不含逗號4.1 含逗號 五、修改5.1 不含逗號5.2 含逗號 六、刪除 XML模版 xml <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3…

智慧園區綜合管理平臺:提升園區運營效能的核心利器

在數字化浪潮席卷各個領域的當下&#xff0c;智慧園區的建設成為了推動產業升級、提升管理效率和服務質量的關鍵舉措。而綜合管理平臺作為智慧園區的 “大腦”&#xff0c;整合了園區運營的各類功能&#xff0c;為園區管理者和企業提供了全方位的支持。本文將基于一份智慧園區功…

碰一碰發視頻源碼搭建,支持OEM

在數字化生活日益普及的今天&#xff0c;便捷的信息傳輸方式成為用戶的迫切需求。“碰一碰發視頻” 功能憑借其新穎的交互體驗和高效的數據傳輸特性&#xff0c;在社交分享、文件傳輸等場景中備受青睞。本文將深入探討碰一碰發視頻源碼搭建的定制化開發流程&#xff0c;涵蓋核心…

Walrus為數據存儲帶來可編程性

要點總結 Walrus 是下一代去中心化存儲協議&#xff0c;旨在突破傳統中心化云存儲的局限&#xff0c;如高昂成本、單點故障、審查和隱私風險等&#xff0c;同時相較于其他去中心化存儲系統也做出了諸多創新&#xff0c;尤其是在可編程性與性能上的提升。“blob” 即 Binary La…

React:利用計算屬性名特點更新表單值

需求&#xff1a;三個input框&#xff0c;在input框輸入時候&#xff0c;獲取最新值&#xff0c;進行數據更新 思路&#xff1a;name屬性的變量設置的和表單的變量一樣&#xff0c;方便通過name屬性更新值 function TenantManage() {const [formData, setFormData] useState…

【軟考高項論文】論信息系統項目的范圍管理

摘要 在信息系統項目管理里&#xff0c;范圍管理極為關鍵。有效的范圍管理可保障項目按時、按質、按量完成&#xff0c;避免變更帶來的混亂與成本超支。本文結合作者參與的一個 2024 年 3 月啟動的信息系統項目&#xff0c;詳細闡述項目范圍管理的過程&#xff0c;包括范圍規劃…

蓋雅工場 2025 香港 SAP NOW 大會深度解析:AI 重構亞太勞動力管理數字化生態

一、前沿技術亮相&#xff1a;AI 驅動人力資源數字化轉型全景展示 在 6 月 13 日舉辦的 2025 香港 SAP NOW 大會上&#xff0c;亞太勞動力管理領軍企業蓋雅工場&#xff08;GaiaWorks&#xff09;以「AI 勞動力管理」為核心&#xff0c;通過主題演講與沉浸式展臺演示&#xf…

Latent Diffusion中VAE損失函數源碼解讀及對損失函數的理解

最近因為工作需求&#xff0c;接觸了Latent Diffusion中VAE訓練的相關代碼&#xff0c;其中損失函數是由名為LPIPSWithDiscriminator的類進行計算的&#xff0c;包括像素級別的重建損失&#xff08;rec_loss&#xff09;、感知損失&#xff08;p_loss&#xff09;和基于判別器&…

MIT 6.824學習心得(1) 淺談分布式系統概論與MapReduce

一個月前機緣巧合&#xff0c;有朋友向我推薦了麻省理工學院非常著名的分布式系統課程MIT 6.824&#xff0c;是由世界五大黑客之一&#xff0c;蠕蟲病毒之父Robert Morris教授進行授課。由于我自己也在做基于分布式微服務架構的業務項目&#xff0c;所以對構建分布式系統這個課…

PCL點云庫入門(第21講)——PCL庫點云特征之RSD特征描述Radius-based Surface Descriptor(RSD)

一、算法原理 RSD: Radius-based Surface Descriptor由 Marton Zsolt et al. 于 2010 年提出&#xff0c;主要用于 點云中物體的幾何形狀識別&#xff08;如球形、柱面、平面等&#xff09;&#xff0c;廣泛用于機器人抓取、點云分割和物體識別等任務中。 1.1、RSD 特征的核心…

zookeeper Curator(4):分布式鎖

文章目錄 分布式鎖分布式鎖的實現zookeeper 分布式鎖原理Curator 實現分布式鎖API1. InterProcessMutex&#xff08;分布式可重入互斥鎖&#xff09;2. InterProcessSemaphoreMutex&#xff08;分布式非可重入互斥鎖&#xff09;3. InterProcessReadWriteLock&#xff08;分布式…

設置方法區內存的大小

方法區內存配置 方法區&#xff08;Method Area&#xff09;是JVM內存模型的一部分&#xff0c;用于存儲類信息、常量、靜態變量等數據。在HotSpot虛擬機中&#xff0c;方法區的具體實現為永久代&#xff08;PermGen&#xff09;或元空間&#xff08;Metaspace&#xff09;&am…

用Flink打造實時數倉:生產環境中的“坑”與“解藥”

目錄 一、實時數倉的“野心”與“現實” 二、數據采集與接入:別讓“源頭”卡脖子 2.1 問題1:Kafka數據亂序與延遲 2.2 問題2:MySQL CDC數據同步異常 三、數據處理與計算:別讓“算力”成瓶頸 3.1 問題3:多表Join性能低下 3.2 問題4:窗口計算觸發延遲 四、狀態管理與…

linux 下 Doris 單點部署

目錄 1. Doris 下載 2. 環境準備 2.1 Linux 操作系統版本需求 2.2 部署依賴 3. Doris 部署 3.1 修改系統配置 3.1.1 修改系統句柄數 3.1.2 關閉swap分區 3.1.3 修改最大內存映射區域數量 3.2 開放端口 3.3 fe 部署 3.4 be 部署 3.5 be添加到Doris集群 4 驗證 4.…

mysql 小版本升級實戰分享

環境說明 當前版本:5.6.51 升級目標版本 mysql 5.7.41 服務啟停通過systemd管理 升級準備&#xff1a; 環境檢查 首先查看當前MySQL的版本信息&#xff0c;執行命令mysql -V&#xff0c;如圖&#xff1a; 備份數據 備份所有數據庫&#xff1a; 當數據量不是特別大的時候…

Python Ai語音識別教程

語音識別是將人類語音轉換為文本的技術&#xff0c;在現代應用中非常有用。本教程將介紹如何使用Python實現基本的AI語音識別功能。 一、文字轉語音 #文字轉語音 #安裝第三方庫 pip install pyttsx3 #導包 &#xff1a; import pyttsx3import pyttsx3#創建語音引擎 a1 pytts…

Day11 制作窗口

文章目錄 1. 顯示窗口&#xff08;harib08d&#xff09;2. 消除閃爍1&#xff08;harib08g&#xff09;3. 消除閃爍2&#xff08;harib08h&#xff09; 本章的前三節做了如下修改&#xff1a; 解決了鼠標無法隱藏在屏幕右側和下側的問題。當鼠標隱藏在右側時會在屏幕最左側產生…

python+uniapp基于微信小程序蜀味道江湖餐飲管理系統nodejs+java

文章目錄 具體實現截圖本項目支持的技術路線源碼獲取詳細視頻演示&#xff1a;文章底部獲取博主聯系方式&#xff01;&#xff01;&#xff01;&#xff01;本系統開發思路進度安排及各階段主要任務java類核心代碼部分展示主要參考文獻&#xff1a;源碼獲取/詳細視頻演示 ##項目…

postgresql增量備份系列二 pg_probackup

已經很久沒有發文章了,主要是最近工作上的內容都不適合發文章公開。可能往后文章發表也不這么頻繁了,不過大家有問題我們可以交流。之前有寫過PG增量備份的其他工具使用方法,pg_probackup也是應用比較多的PG備份工具。 一. pg_probackup pg_probackup 是一個用于管理 Postg…