2016-12-11 10 views
2

golangでは、初期化されていないマップを含む構造体を作成すると、マップを印刷すると<nil>文字列になりません。golangの(nil)マップの印刷で「<nil>」の結果が表示されないのはなぜですか?

なぜnilマップの "print"は<nil>の代わりに "map []"を出力しますか?

// Assume above there is a struct, a.AA, which is created but which otherwise 
// has not created the map. 
//output: 
//map[] 
//map[] 
fmt.Println(a.AA) 
fmt.Println(make(map[string]int64)) 
+4

フォーマッタがそれを印刷する方法です。便宜のためだけですので、表示されているタイプを使用すると便利です。(無制限マップからインデックスを付けることはもちろんありません) – JimB

+0

@JimBこれは実際には答えです。 – icza

答えて

0

nilポインタは空の(ゼロ)マップと同じではありません。ゼロ値に関する信頼できる情報については、https://golang.org/ref/spec#The_zero_valueを参照してください。あなたはnilをしたい場合

、あなたは、次exampleのように、ポインタを必要とする:

package main 

import (
    "fmt" 
) 

func main() { 
    var myMap map[string]int64 
    fmt.Printf("myMap before assignment: %v\n", myMap) 

    myMap = make(map[string]int64) 
    fmt.Printf("myMap after assignment : %v\n", myMap) 

    var myMapPointer *map[string]int64 
    fmt.Printf("myMapPointer before assignment: %v\n", myMapPointer) 

    myMapPointer = new(map[string]int64) 
    fmt.Printf("myMapPointer after assignment : %v\n", myMapPointer) 
} 

これが与える:

myMap before assignment: map[] 
myMap after assignment : map[] 
myMapPointer before assignment: <nil> 
myMapPointer after assignment : &map[] 
+0

あなたが書いた文書を除き、マップのゼロ点は 'nil' https://play.golang.org/p/c6NOfiotCCです – JimB

2

それは物事を明確に行うためです。このコードを実行する場合:

var m map[string]int64 
log.Println(m == nil) 
log.Printf("%T\n", m) 

それが印刷されます:

$ true 
$ map[string]int64 

だからmは、この時点では、実際にnilです。 A nil値(缶)もタイプを持ち、フォーマッタはそれを使用して可能なときに意味のあるものをプリントアウトします。

mapは参照型です。そしてGoでは、値がnilであっても、構造体のメソッドを呼び出すことができます。

そうであっても、独自の構造体のために、あなたは自分構造体とするたびに、構造体の値は、あなたが<nil>より適切なものをプリントアウトすることができますnilある上String() stringメソッドを定義することによりfmt.Stringerインターフェイスを実装することができます。持つ:

type someData struct { 
    someValue string 
} 

func (x *someData) String() string { 
    if x == nil { 
     return "NO PROPER DATA HERE!" 
    } 

    return x.someValue 
} 

をその後、我々は実行する場合:

var data *someData 
log.Println(data) 
data = new(someData) 
data.someValue = "Aloha! :)" 
log.Println(data) 

を出力は次のようになります。

$ NO PROPER DATA HERE! 
$ Aloha! :) 

はその事実にもかかわらず、我々は出力として<nil>を取得していない最初の行で参照してください。その時点でstructポインタはnilです。

関連する問題