以示例為例自定義錯誤類型
自定義錯誤類型通過實現error接口提供richer 信息,如ValidationError結構體攜帶字段和消息;2. 使用errors.As可安全提取具體錯誤類型以進行針對性處理;3. 預定義錯誤變量適用於無上下文的狀態錯誤,通過errors.Is判斷相等性;4. 用%w包裝錯誤可保留原始類型和堆棧,便於透傳分析;5. 枚舉式APIError可攜帶錯誤碼,支持類型斷言獲取細節;最佳實踐包括返回指針、避免字符串比較、優先使用errors.As和errors.Is。
在Go 語言中,自定義錯誤類型是一種常見且推薦的做法,尤其是在構建庫或大型應用時。它能提供更豐富的錯誤信息、更好的可讀性和更強的類型控制。下面通過幾個典型的例子,展示如何使用custom error types
。

1. 實現error
接口的自定義結構體
最常見的方式是定義一個結構體,並實現Error()
方法。
package main import "fmt" // 自定義錯誤類型type ValidationError struct { Field string Message string } // 實現error 接口func (e *ValidationError) Error() string { return fmt.Sprintf("validation error on field %q: %s", e.Field, e.Message) } // 示例函數,返回自定義錯誤func validateAge(age int) error { if age < 0 { return &ValidationError{Field: "age", Message: "age cannot be negative"} } if age > 150 { return &ValidationError{Field: "age", Message: "age is unrealistically high"} } return nil } func main() { err := validateAge(-5) if err != nil { fmt.Println(err) // 輸出: validation error on field "age": age cannot be negative } }
✅ 優點:攜帶上下文信息(字段名、原因等)
✅ 建議:返回指針,避免值拷貝和比較問題
2. 使用類型斷言識別錯誤類型
當你需要根據錯誤類型做不同處理時,可以使用類型斷言或errors.As
。
func main() { err := validateAge(-1) if err != nil { var ve *ValidationError if errors.As(err, &ve) { fmt.Printf("特定處理: 出錯字段是%s\n", ve.Field) } else { fmt.Println("未知錯誤:", err) } } }
?
errors.As()
是Go 1.13 推薦方式,能穿透錯誤包裝(如fmt.Errorf("wrap: %w", err)
)
3. 預定義錯誤變量(簡單場景)
對於不需要攜帶數據的錯誤,可以直接定義全局錯誤變量。
var ( ErrNotFound = errors.New("resource not found") ErrAlreadyExists = errors.New("resource already exists") ) func findUser(id string) (*User, error) { if id == "" { return nil, ErrNotFound } // ... }
✅ 適合狀態類錯誤,可用
errors.Is(err, ErrNotFound)
判斷
4. 包裝錯誤並保留原始類型(Go 1.13 )
使用%w
包裝錯誤,同時保留原始錯誤類型信息。
func readFile(filename string) error { data, err := os.ReadFile(filename) if err != nil { return fmt.Errorf("failed to read config file %s: %w", filename, err) } // ... } func main() { err := readFile("config.json") if err != nil { // 可以檢查底層是否是os.PathError var pathErr *os.PathError if errors.As(err, &pathErr) { fmt.Println("路徑錯誤:", pathErr.Path) } } }
5. 枚舉式錯誤類型(帶代碼)
有時你想返回帶錯誤碼的錯誤。
type APIError struct { Code int Message string } func (e *APIError) Error() string { return e.Message } var ( ErrInternal = &APIError{Code: 500, Message: "internal server error"} ErrForbidden = &APIError{Code: 403, Message: "permission denied"} ) func handleRequest() error { return ErrForbidden } func main() { err := handleRequest() if apiErr, ok := err.(*APIError); ok { fmt.Printf("API 錯誤碼: %d\n", apiErr.Code) } }
最佳實踐總結
- ✅ 使用結構體攜帶錯誤上下文(如字段、ID、狀態)
- ✅ 實現
Error()
方法返回清晰信息 - ✅ 返回錯誤指針,便於類型比較
- ✅ 使用
errors.Is()
判斷預定義錯誤 - ✅ 使用
errors.As()
提取自定義錯誤類型 - ✅ 用
%w
包裝底層錯誤,保留堆棧和類型 - ❌ 避免直接比較錯誤字符串
基本上就這些常見模式。根據你的場景選擇:簡單用var err = errors.New(...)
,複雜用結構體接口判斷。
以上是以示例為例自定義錯誤類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

TOIntegrategolangServicesWithExistingPypythoninFrasture,userestapisorgrpcForinter-serviceCommunication,允許GoandGoandPyThonAppStoStoInteractSeamlessSeamLlyThroughlyThroughStandArdArdAdrotized Protoccols.1.usererestapis(ViaFrameWorkslikeSlikeSlikeGiningOandFlaskInpyThon)Orgrococo(wirs Propococo)

Golangofferssuperiorperformance,nativeconcurrencyviagoroutines,andefficientresourceusage,makingitidealforhigh-traffic,low-latencyAPIs;2.Python,whileslowerduetointerpretationandtheGIL,provideseasierdevelopment,arichecosystem,andisbettersuitedforI/O-bo

Golang主要用於後端開發,但也能在前端領域間接發揮作用。其設計目標聚焦高性能、並發處理和系統級編程,適合構建API服務器、微服務、分佈式系統、數據庫操作及CLI工具等後端應用。雖然Golang不是網頁前端的主流語言,但可通過GopherJS編譯成JavaScript、通過TinyGo運行於WebAssembly,或搭配模板引擎生成HTML頁面來參與前端開發。然而,現代前端開發仍需依賴JavaScript/TypeScript及其生態。因此,Golang更適合以高性能後端為核心的技術棧選擇。

TocompletelyuninstallGolang,firstdeterminehowitwasinstalled(packagemanager,binary,source,etc.),thenremoveGobinariesanddirectories,cleanupenvironmentvariables,anddeleterelatedtoolsandcaches.Beginbycheckinginstallationmethod:commonmethodsincludepackage

在Go中,若希望結構體字段在轉換為JSON時使用自定義字段名,可通過結構體字段的json標籤實現。 1.使用json:"custom_name"標籤指定字段在JSON中的鍵名,如Namestringjson:"username""會使Name字段輸出為"username";2.添加,omitempty可控製字段為空值時省略輸出,例如Emailstringjson:"email,omitempty""

安裝Go的關鍵在於選擇正確版本、配置環境變量並驗證安裝。 1.前往官網下載對應系統的安裝包,Windows使用.msi文件,macOS使用.pkg文件,Linux使用.tar.gz文件並解壓至/usr/local目錄;2.配置環境變量,在Linux/macOS中編輯~/.bashrc或~/.zshrc添加PATH和GOPATH,Windows則在系統屬性中設置PATH為Go的安裝路徑;3.使用goversion命令驗證安裝,並運行測試程序hello.go確認編譯執行正常。整個流程中PATH設置和環

“Go:commandnotfound”通常因環境變量未正確配置導致;1.檢查是否已正確安裝Go,使用whichgo確認路徑;2.手動將Go的bin目錄(如/usr/local/go/bin)添加到PATH環境變量;3.修改對應shell的配置文件(如.bashrc或.zshrc),執行source使配置生效;4.可選設置GOROOT、GOPATH以避免後續模塊問題。完成上述步驟後運行goversion驗證是否修復。

Golang在構建Web服務時CPU和內存消耗通常低於Python。 1.Golang的goroutine模型調度高效,並發請求處理能力強,CPU使用率更低;2.Go編譯為原生代碼,運行時不依賴虛擬機,內存佔用更小;3.Python因GIL和解釋執行機制,在並發場景下CPU和內存開銷更大;4.雖然Python開發效率高、生態豐富,但資源消耗較高,適合併發要求不高的場景。
