2017-03-15 5 views
1
結果がなぜ
package main 

import (
    "fmt" 
) 

type bar struct { 
} 

func (b bar) String() string { 
    return "bar" 
} 

type foo struct { 
    b []*bar 
    bb *bar 
} 

func main() { 
    f := foo{b: []*bar{&bar{}}, bb:&bar{}} 
    fmt.Println(f, f.b, f.bb) 
} 

fmt.Println構造体は、それのメ​​ンバーの文字列()メソッドを使用しない理由

{[0x176f44] 0x176f44} [バー]バー

ません

{[バー]バー} [バー]バー

それには何らかの理由がありますか?実装が容易で可読性に優れているようです。

答えて

3

コードにはいくつかの問題があります。 barStirngが定義されていますが、これはアンエクスポートされているため、フィールドもアンエクスポートされています。これは動作します:

type Bar struct { 
} 

func (b Bar) String() string { 
    return "bar" 
} 

type foo struct { 
    B []Bar 
    BB Bar 
} 

func main() { 
    f := foo{B: []Bar{Bar{}}, BB: Bar{}} 
    fmt.Println(f) 
} 

プレイグラウンド:https://play.golang.org/p/OhoIcB7cA3

*Barと同様に動作します。

+0

ありがとうございました!なぜそれらを輸出しなければならないのか説明できますか?それが何かを印刷するならば、fmt.Printlnはすでにリフレクションを使用して、非エクスポートフィールドを検査しています。なぜ、単にString()バージョンを出力しないのですか? json.Marshalは似ていますが、エクスポートされていないフィールドはシリアル化されません。 –

+0

@HelinWang '{}'を出力すると、非公開フィールドにはアクセスしません。構造体であることが分かります。実際には、私はあなたが 'reflect'を使って非公開フィールドにアクセスできるとは思いません。これが、 'fmt'や' encoding/json'のようなデータを扱うパッケージがエクスポートされたフィールドを必要とする理由です。 –

+0

'{[0x176f44] 0x176f44}'を表示します。私は反射が非公開フィールドにアクセスできると思います:http://stackoverflow.com/questions/17981651/in-go-is-there-any-way-to-access-private-fields-of-a-struct-from-another- packag –

関連する問題