2016-12-02 7 views
-2

私は理解できないこの小さなgolangテストがあります、obj1とobj2の間の唯一の変数宣言の変更を型宣言の重要性、nilの値

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とobj3の間で、関数呼び出しは同じ型(struct pointer vs interface)を返しません。私は結果を理解しているとは完全には分かりません。

任意の助けがカバーの下

答えて

1

https://play.golang.org/p/JcjsJ-_S8I)歓迎され、インタフェースは2つの要素タイプおよび値として実装されています。インタフェースの動的値と呼ばれる値は、任意の具体的な値であり、型は値の型です。 int値3の場合、インターフェイス値には概略的に、(int, 3)が含まれています。

内部値とタイプが両方とも設定されていない場合のみ、インターフェイス値はnilです。(nil, nil)。特に、nilインターフェイスは常にnilタイプを保持します。 *intタイプのnilポインターをインターフェースの値の中に保管すると、ポインターの値にかかわらず、内部タイプは*intになります。(*int, nil)。したがって、その内部のポインタがnilであっても、このようなインタフェース値は になります。

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

+0

はもうこの説明が見つかりませんでした。念押し有難う! – Redtakfeoh