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

go nil處理如何正確返回nil的error

 更新時(shí)間:2023年10月29日 10:05:22   作者:uccs  
這篇文章主要為大家介紹了go中的nil處理,如何正確返回nil的error實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

i == nil 會(huì)生效

對(duì)于下面這段代碼,我們知道 i 實(shí)際上的值就是 nil,所以 i == nil 會(huì)生效

func main() {
  var i *int = nil
  if i == nil {
    fmt.Println("i is nil") // i is nil
  }
}

現(xiàn)在換一種寫法,我們將 i 的類型改成 interface{}i == nil 依然會(huì)生效

func main() {
  var i interface{} = nil
  if i == nil {
    fmt.Println("i is nil") // i is nil
  }
}

我們接著改造,將 i == nil 的邏輯封裝成函數(shù) IsNil

func IsNil(i interface{}) {
  if i == nil {
    fmt.Println("i is nil")
  }
}
func main() {
  var i *int = nil
  IsNil(i)
}

IsNil 中的 i == nil 不生效

然后居然發(fā)現(xiàn) IsNil 中的 i == nil 不生效了,為什么呢?

因?yàn)閷?duì)于 interface{} 類型的值來說,如果要判斷它是 nil,必須同時(shí)滿足 type T 和 value V 都是 nil 才行

可以用 reflect 中的 TypeOf 和 ValueOf

var i *int = nil
fmt.Println(reflect.TypeOf(i), reflect.ValueOf(i)) // *int  <nil>
var i interface{} = nil
fmt.Println(reflect.TypeOf(i), reflect.ValueOf(i)) // <nil> <invalid reflect.Value>

但是如果我們?cè)诤瘮?shù)中用 interface{} 作為參數(shù)的類型,表示并不代表參數(shù)就是 interface{} 類型,而是任意類型,調(diào)用時(shí)傳入啥類型就是啥類型,如下代碼

var i interface{} = 1
fmt.Println(reflect.TypeOf(i)) // int
var j interface{} = "hello"
fmt.Println(reflect.TypeOf(j)) // string
var k interface{} = nil
fmt.Println(reflect.TypeOf(k)) // nil

所以只有當(dāng)我們傳入類型的參數(shù)是 interface{} 類型時(shí),且 value 為 nil 時(shí),i == nil 才會(huì)生效

否則其他情況都不會(huì)生效

func main() {
  var i interface{} = nil
  IsNil(i)  // i is nil
}
func IsNil(i interface{}) {
  if i == nil {
    fmt.Println("i is nil")
  }
}

這個(gè)坑可能會(huì)出現(xiàn)在返回 error 的函數(shù)中,比如下面這段代碼

在函數(shù) SomeThing 中提前定義了 myError,然后一系列的處理后,返回了 myError

業(yè)務(wù)邏輯

后面的業(yè)務(wù)邏輯需要判斷 err 是否為 nil

type MyError struct{}
func (me *MyError) Error() string {
  return "my error"
}
func SomeThing() error {
  var myError *MyError    // 默認(rèn)初始化為 nil
  // ...
  return myError
}
func main() {
  err := SomeThing()
  fmt.Println(reflect.TypeOf(err), reflect.ValueOf(err)) // *main.MyError <nil>
  if err != nil {     // 雖然沒有返回,這里會(huì)被執(zhí)行,因?yàn)?err 的類型不是 nil
    fmt.Println(err)
  }
}

從上面的代碼我們看到,SomeThing 函數(shù)中定義的 myError 是 *MyError 類型,雖然返回了 nil,但是 err 的類型不是 nil,所以 err != nil 會(huì)生效,不符合預(yù)期

如果修改這個(gè)問題呢,當(dāng)我們需要返回 nil 時(shí),顯示指明返回 nil,如下代碼:

type MyError struct{}
func (me *MyError) Error() string {
  return "my error"
}
func SomeThing() error {
  var myError *MyError    // 默認(rèn)初始化為 nil
  // ...
  return nil
}
func main() {
  err := SomeThing()
  fmt.Println(reflect.TypeOf(err), reflect.ValueOf(err)) // &lt;nil&gt; &lt;invalid reflect.Value&gt;
  if err != nil {     // 這段代碼不會(huì)被執(zhí)行
    fmt.Println(err)
  }
}

總結(jié)

需要返回 nil 時(shí),要顯示返回 nil,不要用指針類型的零值

以上就是go nil處理如何正確返回nil的error的詳細(xì)內(nèi)容,更多關(guān)于go nil處理返回error的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言Handler詳細(xì)說明

    Go語言Handler詳細(xì)說明

    這篇文章主要介紹了Go語言Handler詳細(xì)說明,Handler用于處理請(qǐng)求并給予響應(yīng)。更嚴(yán)格地說,用來讀取請(qǐng)求體、并將請(qǐng)求對(duì)應(yīng)的響應(yīng)字段(respones header)寫入ResponseWriter中,需要的朋友可以參考下
    2022-04-04
  • golang int64轉(zhuǎn)int的方法

    golang int64轉(zhuǎn)int的方法

    這篇文章主要介紹了golang int64轉(zhuǎn)int,本文給大家提供兩種方法 ,將 golang int64 轉(zhuǎn)換為golang int,結(jié)合實(shí)例代碼給大家分享轉(zhuǎn)換方法,需要的朋友可以參考下
    2023-01-01
  • Golang實(shí)現(xiàn)獲取與解析命令行參數(shù)

    Golang實(shí)現(xiàn)獲取與解析命令行參數(shù)

    這篇文章主要為大家詳細(xì)介紹了Golang如何實(shí)現(xiàn)獲取與解析命令行參數(shù),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下
    2024-01-01
  • go語言接口之接口值舉例詳解

    go語言接口之接口值舉例詳解

    接口是一種抽象類型,是對(duì)其他類型行為的概括與抽象,從語法角度來看,接口是一組方法定義的集合,下面這篇文章主要給大家介紹了關(guān)于go語言接口之接口值的相關(guān)資料,文章通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Golang讀寫Excel的方法教程

    Golang讀寫Excel的方法教程

    這篇文章主要給大家介紹了關(guān)于Golang讀寫Excel的方法教程,golang操作excel利用的是Excelize,Excelize是Golang編寫的一個(gè)用來操作 Office Excel 文檔類庫,基于微軟的Office OpenXML標(biāo)準(zhǔn),文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • Golang實(shí)現(xiàn)Redis事務(wù)深入探究

    Golang實(shí)現(xiàn)Redis事務(wù)深入探究

    這篇文章主要介紹了Golang實(shí)現(xiàn)Redis事務(wù)深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 徹底理解golang中什么是nil

    徹底理解golang中什么是nil

    這篇文章主要介紹了golang中的nil用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 解決golang結(jié)構(gòu)體tag編譯錯(cuò)誤的問題

    解決golang結(jié)構(gòu)體tag編譯錯(cuò)誤的問題

    這篇文章主要介紹了解決golang結(jié)構(gòu)體tag編譯錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go語言Cookie用法分析

    Go語言Cookie用法分析

    這篇文章主要介紹了Go語言Cookie用法,結(jié)合實(shí)例形式分析了Go語言Cookie的設(shè)置、讀取等相關(guān)操作技巧,需要的朋友可以參考下
    2017-02-02
  • Golang中Delve版本太低無法Debug的問題

    Golang中Delve版本太低無法Debug的問題

    這篇文章主要介紹了Golang中Delve版本太低無法Debug的問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論

墨江| 磐石市| 肥乡县| 大埔区| 确山县| 深水埗区| 曲周县| 铁岭县| 麻栗坡县| 深水埗区| 清涧县| 铜山县| 扶风县| 香河县| 平乡县| 偃师市| 清水河县| 隆德县| 芦山县| 汉沽区| 郓城县| 商都县| 宁阳县| 高阳县| 景德镇市| 永顺县| 洪雅县| 普兰县| 郸城县| 东丽区| 长寿区| 安图县| 洛宁县| 隆回县| 龙门县| 永靖县| 乌拉特前旗| 科技| 偃师市| 奉贤区| 巨野县|