最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go之errors.New和fmt.Errorf?的區(qū)別小結(jié)

 更新時(shí)間:2025年08月18日 11:57:37   作者:太涼  
本文主要介紹了Go之errors.New和fmt.Errorf的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

error的基本用法

1. 獲取錯(cuò)誤信息

package main

import (
    "errors"
    "fmt"
)

func main() {
    // 創(chuàng)建錯(cuò)誤
    err := errors.New("文件不存在")
    
    // 獲取錯(cuò)誤信息
    errorMessage := err.Error()
    fmt.Println("錯(cuò)誤信息:", errorMessage) // 輸出: 錯(cuò)誤信息: 文件不存在
    
    // 直接打印錯(cuò)誤
    fmt.Println("直接打印:", err) // 輸出: 直接打印: 文件不存在
}

2. 在條件判斷中使用

package main

import (
    "errors"
    "fmt"
)

func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("除數(shù)不能為零")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 0)
    if err != nil {
        // 獲取錯(cuò)誤信息進(jìn)行判斷
        if err.Error() == "除數(shù)不能為零" {
            fmt.Println("檢測(cè)到除零錯(cuò)誤")
        }
        
        // 打印錯(cuò)誤信息
        fmt.Println("錯(cuò)誤:", err.Error())
        return
    }
    fmt.Println("結(jié)果:", result)
}

基本區(qū)別

1.函數(shù)簽名

// errors.New - 只接受字符串
func New(text string) error

// fmt.Errorf - 接受格式化字符串和參數(shù)
func Errorf(format string, a ...interface{}) error

2.使用場(chǎng)景

package main

import (
    "errors"
    "fmt"
)

func main() {
    // errors.New - 簡(jiǎn)單靜態(tài)錯(cuò)誤
    err1 := errors.New("文件不存在")
    fmt.Println(err1)
    
    // fmt.Errorf - 動(dòng)態(tài)格式化錯(cuò)誤
    filename := "config.txt"
    err2 := fmt.Errorf("文件 %s 不存在", filename)
    fmt.Printf("err: %v \n", err.Error())
}

詳細(xì)對(duì)比

1. 靜態(tài)錯(cuò)誤 vs 動(dòng)態(tài)錯(cuò)誤

package main

import (
    "errors"
    "fmt"
)

// 使用 errors.New - 適合靜態(tài)錯(cuò)誤
var (
    ErrNotFound = errors.New("記錄未找到")
    ErrInvalidInput = errors.New("無(wú)效輸入")
    ErrTimeout = errors.New("操作超時(shí)")
)

// 使用 fmt.Errorf - 適合動(dòng)態(tài)錯(cuò)誤
func validateAge(age int) error {
    if age < 0 {
        return fmt.Errorf("年齡不能為負(fù)數(shù): %d", age)
    }
    if age > 150 {
        return fmt.Errorf("年齡不能超過(guò)150歲: %d", age)
    }
    return nil
}

func main() {
    // 靜態(tài)錯(cuò)誤
    fmt.Println(ErrNotFound)
    
    // 動(dòng)態(tài)錯(cuò)誤
    err := validateAge(-5)
    fmt.Println(err)
}

2. 錯(cuò)誤比較

package main

import (
    "errors"
    "fmt"
)

var ErrNotFound = errors.New("記錄未找到")

func main() {
    // errors.New 創(chuàng)建的錯(cuò)誤可以用于比較
    err1 := ErrNotFound
    err2 := ErrNotFound
    
    fmt.Println(err1 == err2) // true
    
    // fmt.Errorf 創(chuàng)建的錯(cuò)誤每次都是新的
    err3 := fmt.Errorf("記錄未找到")
    err4 := fmt.Errorf("記錄未找到")
    
    fmt.Println(err3 == err4) // false
}

3. 錯(cuò)誤包裝

package main

import (
    "errors"
    "fmt"
)

func processFile(filename string) error {
    // 模擬文件操作錯(cuò)誤
    originalErr := errors.New("權(quán)限不足")
    
    // 使用 fmt.Errorf 包裝錯(cuò)誤
    return fmt.Errorf("處理文件 %s 失敗: %v", filename, originalErr)
}

func main() {
    err := processFile("config.txt")
    fmt.Println(err) // 輸出: 處理文件 config.txt 失敗: 權(quán)限不足
}

實(shí)際應(yīng)用場(chǎng)景

1. 使用 errors.New 的場(chǎng)景

package main

import (
    "errors"
    "fmt"
)

// 定義包級(jí)別的錯(cuò)誤常量
var (
    ErrUserNotFound = errors.New("用戶不存在")
    ErrInvalidPassword = errors.New("密碼錯(cuò)誤")
    ErrDatabaseConnection = errors.New("數(shù)據(jù)庫(kù)連接失敗")
)

func authenticateUser(userID string, password string) error {
    if userID == "" {
        return ErrUserNotFound
    }
    
    if password == "" {
        return ErrInvalidPassword
    }
    
    // 驗(yàn)證邏輯...
    return nil
}

func main() {
    err := authenticateUser("", "123456")
    if err == ErrUserNotFound {
        fmt.Println("用戶不存在")
    } else if err == ErrInvalidPassword {
        fmt.Println("密碼錯(cuò)誤")
    }
}

2. 使用 fmt.Errorf 的場(chǎng)景

package main

import (
    "fmt"
    "strconv"
)

func parseUserID(userIDStr string) (int, error) {
    userID, err := strconv.Atoi(userIDStr)
    if err != nil {
        return 0, fmt.Errorf("解析用戶ID失敗: %v", err)
    }
    
    if userID <= 0 {
        return 0, fmt.Errorf("用戶ID必須大于0,當(dāng)前值: %d", userID)
    }
    
    return userID, nil
}

func getUserInfo(userIDStr string) error {
    userID, err := parseUserID(userIDStr)
    if err != nil {
        return fmt.Errorf("獲取用戶信息失敗: %v", err)
    }
    
    fmt.Printf("用戶ID: %d\n", userID)
    return nil
}

func main() {
    err := getUserInfo("abc")
    if err != nil {
        fmt.Println("錯(cuò)誤:", err)
    }
}

自定義錯(cuò)誤類型

1.基本用法

package main

import "fmt"

// 自定義錯(cuò)誤類型
type ValidationError struct {
    Field   string
    Message string
}

// 實(shí)現(xiàn) Error() 方法
func (e *ValidationError) Error() string {
    return fmt.Sprintf("驗(yàn)證失敗: 字段 '%s' - %s", e.Field, e.Message)
}

func validateUser(name string) error {
    if name == "" {
        return &ValidationError{
            Field:   "name",
            Message: "用戶名不能為空",
        }
    }
    return nil
}

func main() {
    err := validateUser("")
    if err != nil {
        // 獲取錯(cuò)誤信息
        fmt.Println("錯(cuò)誤信息:", err.Error())
        
        // 類型斷言獲取詳細(xì)信息
        if validationErr, ok := err.(*ValidationError); ok {
            fmt.Printf("字段: %s, 消息: %s\n", validationErr.Field, validationErr.Message)
        }
    }
}

2.自定義錯(cuò)誤類型示例

package main

import (
    "fmt"
    "time"
)

// 1. 基礎(chǔ)自定義錯(cuò)誤類型
type ValidationError struct {
    Field   string
    Message string
    Value   interface{}
}

// 實(shí)現(xiàn) error 接口
func (e *ValidationError) Error() string {
    return fmt.Sprintf("驗(yàn)證失敗: 字段 '%s' 的值 '%v' - %s", e.Field, e.Value, e.Message)
}

// 2. 業(yè)務(wù)錯(cuò)誤類型
type BusinessError struct {
    Code    int
    Message string
    Time    time.Time
}

func (e *BusinessError) Error() string {
    return fmt.Sprintf("[%d] %s (時(shí)間: %s)", e.Code, e.Message, e.Time.Format("2006-01-02 15:04:05"))
}

// 3. 網(wǎng)絡(luò)錯(cuò)誤類型
type NetworkError struct {
    URL     string
    Status  int
    Message string
}

func (e *NetworkError) Error() string {
    return fmt.Sprintf("網(wǎng)絡(luò)請(qǐng)求失敗: %s (狀態(tài)碼: %d) - %s", e.URL, e.Status, e.Message)
}

// 4. 復(fù)合錯(cuò)誤類型
type CompositeError struct {
    Errors []error
    Context string
}

func (e *CompositeError) Error() string {
    if len(e.Errors) == 0 {
        return fmt.Sprintf("復(fù)合錯(cuò)誤: %s", e.Context)
    }
    
    result := fmt.Sprintf("復(fù)合錯(cuò)誤 [%s]:\n", e.Context)
    for i, err := range e.Errors {
        result += fmt.Sprintf("  %d. %s\n", i+1, err.Error())
    }
    return result
}

// 5. 帶錯(cuò)誤碼的錯(cuò)誤類型
type CodedError struct {
    Code    int
    Message string
    Details map[string]interface{}
}

func (e *CodedError) Error() string {
    if len(e.Details) == 0 {
        return fmt.Sprintf("[%d] %s", e.Code, e.Message)
    }
    return fmt.Sprintf("[%d] %s - 詳情: %v", e.Code, e.Message, e.Details)
}

// 使用示例函數(shù)
func validateUser(name string, age int) error {
    if name == "" {
        return &ValidationError{
            Field:   "name",
            Message: "用戶名不能為空",
            Value:   name,
        }
    }
    
    if age < 0 || age > 150 {
        return &ValidationError{
            Field:   "age",
            Message: "年齡必須在 0-150 之間",
            Value:   age,
        }
    }
    
    return nil
}

func processOrder(orderID string) error {
    if orderID == "" {
        return &BusinessError{
            Code:    1001,
            Message: "訂單ID不能為空",
            Time:    time.Now(),
        }
    }
    
    // 模擬網(wǎng)絡(luò)請(qǐng)求失敗
    if orderID == "invalid" {
        return &NetworkError{
            URL:     "https://api.example.com/orders/" + orderID,
            Status:  404,
            Message: "訂單不存在",
        }
    }
    
    return nil
}

func complexOperation() error {
    var errors []error
    
    // 模擬多個(gè)操作
    if err := validateUser("", 25); err != nil {
        errors = append(errors, err)
    }
    
    if err := processOrder(""); err != nil {
        errors = append(errors, err)
    }
    
    if len(errors) > 0 {
        return &CompositeError{
            Errors:  errors,
            Context: "用戶注冊(cè)操作",
        }
    }
    
    return nil
}

func main() {
    fmt.Println("=== 自定義錯(cuò)誤類型示例 ===\n")
    
    // 1. 驗(yàn)證錯(cuò)誤示例
    fmt.Println("1. 驗(yàn)證錯(cuò)誤:")
    if err := validateUser("", 25); err != nil {
        fmt.Printf("   %s\n", err.Error())
    }
    
    if err := validateUser("張三", 200); err != nil {
        fmt.Printf("   %s\n", err.Error())
    }
    
    // 2. 業(yè)務(wù)錯(cuò)誤示例
    fmt.Println("\n2. 業(yè)務(wù)錯(cuò)誤:")
    if err := processOrder(""); err != nil {
        fmt.Printf("   %s\n", err.Error())
    }
    
    // 3. 網(wǎng)絡(luò)錯(cuò)誤示例
    fmt.Println("\n3. 網(wǎng)絡(luò)錯(cuò)誤:")
    if err := processOrder("invalid"); err != nil {
        fmt.Printf("   %s\n", err.Error())
    }
    
    // 4. 復(fù)合錯(cuò)誤示例
    fmt.Println("\n4. 復(fù)合錯(cuò)誤:")
    if err := complexOperation(); err != nil {
        fmt.Printf("   %s\n", err.Error())
    }
    
    // 5. 帶錯(cuò)誤碼的錯(cuò)誤示例
    fmt.Println("\n5. 帶錯(cuò)誤碼的錯(cuò)誤:")
    codedErr := &CodedError{
        Code:    5001,
        Message: "數(shù)據(jù)庫(kù)連接失敗",
        Details: map[string]interface{}{
            "host":     "localhost:3306",
            "database": "users",
            "reason":   "連接超時(shí)",
        },
    }
    fmt.Printf("   %s\n", codedErr.Error())
    
    // 6. 錯(cuò)誤類型檢查示例
    fmt.Println("\n6. 錯(cuò)誤類型檢查:")
    err := validateUser("", 25)
    if validationErr, ok := err.(*ValidationError); ok {
        fmt.Printf("   這是一個(gè)驗(yàn)證錯(cuò)誤,字段: %s\n", validationErr.Field)
    }
    
    if businessErr, ok := err.(*BusinessError); ok {
        fmt.Printf("   這是一個(gè)業(yè)務(wù)錯(cuò)誤,錯(cuò)誤碼: %d\n", businessErr.Code)
    }
}

到此這篇關(guān)于Go之errors.New 和 fmt.Errorf 的區(qū)別的文章就介紹到這了,更多相關(guān)Go errors.New 和 fmt.Errorf 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go json反序列化“null“的問(wèn)題解決

    Go json反序列化“null“的問(wèn)題解決

    本文主要介紹了Go json反序列化“null“的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go語(yǔ)言的方法接受者類型用值類型還是指針類型?

    Go語(yǔ)言的方法接受者類型用值類型還是指針類型?

    這篇文章主要介紹了Go語(yǔ)言的方法接受者類型用值類型還是指針類型?本文還同時(shí)講解了關(guān)于接受者的命名方式,需要的朋友可以參考下
    2014-10-10
  • Go語(yǔ)言fsnotify接口實(shí)現(xiàn)監(jiān)測(cè)文件修改

    Go語(yǔ)言fsnotify接口實(shí)現(xiàn)監(jiān)測(cè)文件修改

    這篇文章主要為大家介紹了Go語(yǔ)言fsnotify接口實(shí)現(xiàn)監(jiān)測(cè)文件修改的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Golang Model 字段自動(dòng)化校驗(yàn)設(shè)計(jì)方案

    Golang Model 字段自動(dòng)化校驗(yàn)設(shè)計(jì)方案

    在我們?nèi)粘i_(kāi)發(fā)中,不可避免的總要去進(jìn)行各種參數(shù)校驗(yàn),但是如果在某個(gè)場(chǎng)景中,要校驗(yàn)的字段非常多,并且在其中還有耦合關(guān)系,那么我們手寫校驗(yàn)邏輯就變得非常的低效且難以維護(hù),本篇文檔就基于 DDD 領(lǐng)域模型設(shè)計(jì)的思想下,提供自動(dòng)化的校驗(yàn)?zāi)P妥侄?感興趣的朋友一起看看吧
    2025-02-02
  • Go語(yǔ)言學(xué)習(xí)之反射的用法詳解

    Go語(yǔ)言學(xué)習(xí)之反射的用法詳解

    反射指的是運(yùn)行時(shí)動(dòng)態(tài)的獲取變量的相關(guān)信息。本文將為大家詳細(xì)介紹Go語(yǔ)言中反射的用法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-04-04
  • Go語(yǔ)言利用time.After實(shí)現(xiàn)超時(shí)控制的方法詳解

    Go語(yǔ)言利用time.After實(shí)現(xiàn)超時(shí)控制的方法詳解

    最近在學(xué)習(xí)golang,所以下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言利用time.After實(shí)現(xiàn)超時(shí)控制的相關(guān)資料,文中通過(guò)示例介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Golang CSP并發(fā)機(jī)制及使用模型

    Golang CSP并發(fā)機(jī)制及使用模型

    這篇文章主要為大家介紹了Golang CSP并發(fā)機(jī)制及使用模型,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Go重寫http請(qǐng)求重定向的方法

    Go重寫http請(qǐng)求重定向的方法

    當(dāng)使用Go語(yǔ)言進(jìn)行 HTTP 請(qǐng)求時(shí),默認(rèn)情況下,http.Client 會(huì)自動(dòng)處理服務(wù)器返回的重定向響應(yīng)(3xx 狀態(tài)碼),本文將詳細(xì)介紹如何在 Go 中實(shí)現(xiàn)禁止 HTTP 請(qǐng)求的重定向、限制重定向次數(shù)以及添加自定義重定向策略,需要的朋友可以參考下
    2024-08-08
  • golang如何優(yōu)雅的編寫事務(wù)代碼示例

    golang如何優(yōu)雅的編寫事務(wù)代碼示例

    這篇文章主要介紹了golang如何優(yōu)雅的編寫事務(wù)代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Go語(yǔ)言實(shí)現(xiàn)Kafka消息隊(duì)列的示例代碼

    Go語(yǔ)言實(shí)現(xiàn)Kafka消息隊(duì)列的示例代碼

    本文主要介紹了Go語(yǔ)言實(shí)現(xiàn)Kafka消息隊(duì)列的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07

最新評(píng)論

巴青县| 亳州市| 蓬溪县| 抚宁县| 资溪县| 台前县| 宁河县| 小金县| 读书| 酒泉市| 永清县| 大埔县| 汤原县| 西昌市| 达州市| 鹤峰县| 体育| 固阳县| 博湖县| 琼中| 杂多县| 三台县| 克什克腾旗| 固始县| 自贡市| 城步| 宁河县| 南澳县| 和政县| 潮安县| 石河子市| 利川市| 砚山县| 忻城县| 合作市| 周口市| 永靖县| 五台县| 莱芜市| 东乌珠穆沁旗| 涡阳县|