[golang] 爲何接口變量的值不是nil?

測試代碼

package main

import (
    "fmt"
)

func main() {
    doIt := func(args int) interface{} {
        var result *struct{} = nil
        if args > 0 {
            result = &struct{}{}
        }
        return result
    }

    if res := doIt(-1); res != nil {
        fmt.Println("res != nil")
    } else {
        fmt.Println("res == nil")
    }
}

上面的代碼輸出res != nilgit

doIt的返回類型是 interface{} 空接口, 代碼中 var result *struct{} = nil 是nil, 可是 返回的結果是interface{} , 空接口github

對於空接口, 空接口類型能夠保存任何值,也能夠從空接口中取出原值golang

接口類型自己是沒法被值化的。在咱們賦予它實際的值以前,它的值必定會是nil,這也是它的零值。反過來說,一旦它被賦予了某個實現類型的值,它的值就再也不是nil了。後端

返回的空接口包含了指向對象result的類型信息(type)和數據指針(data)也就是說接口變量的值並不等同於這個可被稱爲動態值(result)的副本。它會包含兩個指針,一個指針指向動態值(result),一個指針指向類型信息測試

iface & eface

相關文章
相關標籤/搜索