第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 返回 nil 不返回 nil

Golang 返回 nil 不返回 nil

Go
qq_遁去的一_1 2023-05-22 15:55:06
我創(chuàng)建了一個自定義錯誤類型來包裝錯誤,以便在 Golang 中更輕松地進行調(diào)試。當(dāng)有錯誤要打印時它可以工作,但現(xiàn)在它會引起恐慌。演示type Error struct {    ErrString string}func (e *Error) Error() string {    return e.ErrString}func Wrap(err error, str string) *Error {    if err == nil {        return nil    }    e := &Error{        ErrString: str + err.Error(),    }    return e}當(dāng)我調(diào)用一個函數(shù)并且它沒有返回錯誤時,我應(yīng)該仍然能夠包裝錯誤。預(yù)期的行為是如果錯誤為零,它應(yīng)該簡單地忽略它,不幸的是它恰恰相反。func foo() error {    err := bar()    return Wrap(err, "bar called")}func bar() error {    return nil}func main() {    err := foo()    if err != nil {        fmt.Printf("Found error %v\n",err)        return    }    fmt.Println("No Errors")}我希望它能打印出來No errors。Found error <nil>相反,即使錯誤為零,它也會打印出來。
查看完整描述

4 回答

?
慕仙森

TA貢獻1827條經(jīng)驗 獲得超8個贊

由于您的Error類型實現(xiàn)了error接口,因此最簡單的解決方案是返回一個errorin Wrap():


func Wrap(err error, str string) error {

    if err == nil {

        return nil

    }

    e := &Error{

        ErrString: str + err.Error(),

    }

    return e

}


查看完整回答
反對 回復(fù) 2023-05-22
?
慕妹3242003

TA貢獻1824條經(jīng)驗 獲得超6個贊

輸入錯誤

error 內(nèi)置接口類型是表示錯誤條件的常規(guī)接口,nil 值表示沒有錯誤。

type?error?interface?{
????Error()?string?}

類型err的值不是零。它是類型的值。事實上,是interfaceerrornil*main.Errorerr != nil && err.(*Error) == niltrue


例如,

package main


import (

? ? "fmt"

)


func error1() {

? ? err := foo()

? ? fmt.Printf("%T %v %v %v\n", err, err, err == nil, err.(*Error) == nil)

? ? if err != nil {

? ? ? ? fmt.Printf("Found error %v\n", err)

? ? ? ? return

? ? }

? ? fmt.Println("No Errors")

}


func error2() {

? ? err := foo()

? ? fmt.Printf("%T %v %v %v\n", err, err, err == nil, err.(*Error) == nil)

? ? if err != nil && err.(*Error) != nil {

? ? ? ? fmt.Printf("Found error %v\n", err)

? ? ? ? return

? ? }

? ? fmt.Println("No Errors")

}


type Error struct {

? ? ErrString string

}


func (e *Error) Error() string {

? ? return e.ErrString

}


func Wrap(err error, str string) *Error {

? ? if err == nil {

? ? ? ? return nil

? ? }

? ? e := &Error{

? ? ? ? ErrString: str + err.Error(),

? ? }

? ? return e

}


func foo() error {

? ? err := bar()

? ? return Wrap(err, "bar called")

}


func bar() error {

? ? return nil

}


func main() {

? ? error1()

? ? fmt.Println()

? ? error2()

}

游樂場:https://play.golang.org/p/nwNRa2sNwj0


輸出:


*main.Error <nil> false true

Found error <nil>


*main.Error <nil> false true

No Errors


查看完整回答
反對 回復(fù) 2023-05-22
?
天涯盡頭無女友

TA貢獻1831條經(jīng)驗 獲得超9個贊

將 foo() 返回值更改為 *Error


func foo() error {

    err := bar()

    return Wrap(err, "bar called")

}

或者:


func Wrap(err error, str string) error{

    if err == nil {

        return nil

    }

    e := &Error{

        ErrString: str + err.Error(),

    }

    return e

}


查看完整回答
反對 回復(fù) 2023-05-22
?
交互式愛情

TA貢獻1712條經(jīng)驗 獲得超3個贊

if err != nil

正在將 err 變量與 nil 進行比較error,但它實際上是 nil*Error


將代碼更改為


err:=foo()

var  nilerror *Error = nil

if err != nilerror {

    fmt.Printf("Found error %v\n",err)

    return

}

fmt.Println("No Errors")

產(chǎn)生預(yù)期的結(jié)果。


查看完整回答
反對 回復(fù) 2023-05-22
  • 4 回答
  • 0 關(guān)注
  • 263 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號