golang裡interfacenull 指標

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

interfacenull 指標不為nil

當把一個null 指標對象賦值給一個interface後,

    var pi *int = nil    var i interface{}    i = pi    fmt.Println(i == nil) // 結果為 false

這個不難理解,因為i = pi,不是將nil賳值給i,而是讓i指向了pi這個對象。
簡單翻了下源碼,interface的定義應該是下面這兩中的一個。

type iface struct {    tab  *itab    data unsafe.Pointer}type eface struct {    _type *_type    data  unsafe.Pointer}

i = pi其實相當於i.data = unsafe.Pointer(&pi),而i == nil相當於i.data == nil

判斷interface裡的指標是否為空白

那麼,現在的問題是,如何判斷interface裡的指標是否為空白呢?

  1. 知道類型的情況下,自然是可以使用類型斷言後判空。如ai, ok := i.(*int),之後判斷ai == nil

  2. 不知道是何種類型的指標,就只好藉助反射了vi := reflect.ValueOf(i),後使用vi.IsNil()來判斷。但如果i裡放到不是一個指標,調用IsNil會出異常,則可能要寫一個這樣的函數來判空

func IsNil(i interface{}) bool {    defer func() {        recover()    }()    vi := reflect.ValueOf(i)    return vi.IsNil()}

但有這樣強加一個defer的recover確實不好看,於是藉助類型判斷變成這樣

func IsNil(i interface{}) bool {    vi := reflect.ValueOf(i)    if vi.Kind() == reflect.Ptr {        return vi.IsNil()    }    return false}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.