在golang,nil值中键入声明重要性

时间:2016-12-02 07:56:55

标签: go

我有一个我无法理解的小golang测试:

package main

import "fmt"

type myObj struct {
}

func nilObj() *myObj {
    return nil
}

func nilInt() interface{} {
    return nil
}

func main() {
    var obj1 interface{}
    fmt.Println(obj1 == nil)    // true
    obj1 = nilObj()
    fmt.Println(obj1 == nil)    // false

    var obj2 *myObj
    fmt.Println(obj2 == nil)    // true
    obj2 = nilObj()
    fmt.Println(obj2 == nil)    // true

    var obj3 interface{}
    fmt.Println(obj3 == nil)    // true
    obj3 = nilInt()
    fmt.Println(obj3 == nil)    // true
}

在obj1和obj2之间,只有变量声明发生变化,但结果却不同。

在obj1和obj3之间,函数调用不返回相同的类型(struct pointer vs interface)。我不完全确定我理解结果。

欢迎任何帮助(https://play.golang.org/p/JcjsJ-_S8I

1 个答案:

答案 0 :(得分:2)

  

在幕后,接口实现为两个元素,一个类型和一个值。该值称为接口的动态值,是一个任意的具体值,类型是值的类型。对于int值3,接口值示意性地包含(int, 3)

     

仅当内部值和类型都未设置nil时,接口值才为(nil, nil)。特别是,nil接口始终保持nil类型。如果我们在接口值中存储类型为nil的{​​{1}}指针,则无论指针的值如何,内部类型都将为*int*int。因此,即使内部指针是 (*int, nil),这样的接口值也将是非nil

https://golang.org/doc/faq#nil_error