2017-03-28 5 views
4

コードスニペットは次のとおりです。golang(* interface {})(nil)がnilかどうか

package main 

import (
    "fmt" 
    "reflect" 
) 

func main() { 
    a := (*interface{})(nil) 
    fmt.Println(reflect.TypeOf(a), reflect.ValueOf(a)) 
    var b interface{} = (*interface{})(nil) 
    fmt.Println(reflect.TypeOf(b), reflect.ValueOf(b)) 
    fmt.Println(a == nil, b == nil) 
} 

以下のような出力: *interface {} <nil> *interface {} <nil> true false のでvar interface{}は、なぜ、:=は異なるのですか?

答えて

7

はカバーの下golang faq

によれば、インタフェースは2つの要素タイプおよび値として実装されています。インタフェースの動的値と呼ばれる値は、任意の具体的な値であり、型は値の型です。 int値3の場合、インタフェース値には、(int、3)が含まれます。

内部値とタイプが両方とも設定されていない場合(nil、nil)のみ、インターフェイス値はnilになります。特に、nilインタフェースは常にnil型を保持します。 * int型のnilポインタをインタフェース値の中に格納すると、内部型はポインタの値に関係なく* intになります:(* int、nil)したがって、そのようなインタフェース値は、内部ポインタがnilであっても非nilになります。

a := (*interface{})(nil)var a *interface{} = nilと等しい。

しかしvar b interface{} = (*interface{})(nil)bnilないinterface{}を入力して、interface{}変数のみnilそれはタイプと値の両方がnilありだとき、明らかに*interface{}を入力している意味。

+0

ニースの答えは、これを知らなかった。私はあなたの説明を理解するのに苦労したと言っています...あなたのリンクから最初の2つの段落を引用することができます、それはあなたの答えに価値を追加します! – alexbt

+0

編集中、ありがとう@alexbt – zzn

関連する問題