それは物事を明確に行うためです。このコードを実行する場合:
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
です。
フォーマッタがそれを印刷する方法です。便宜のためだけですので、表示されているタイプを使用すると便利です。(無制限マップからインデックスを付けることはもちろんありません) – JimB
@JimBこれは実際には答えです。 – icza