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} [バー]バー
ません
{[バー]バー} [バー]バー
それには何らかの理由がありますか?実装が容易で可読性に優れているようです。
ありがとうございました!なぜそれらを輸出しなければならないのか説明できますか?それが何かを印刷するならば、fmt.Printlnはすでにリフレクションを使用して、非エクスポートフィールドを検査しています。なぜ、単にString()バージョンを出力しないのですか? json.Marshalは似ていますが、エクスポートされていないフィールドはシリアル化されません。 –
@HelinWang '{}'を出力すると、非公開フィールドにはアクセスしません。構造体であることが分かります。実際には、私はあなたが 'reflect'を使って非公開フィールドにアクセスできるとは思いません。これが、 'fmt'や' encoding/json'のようなデータを扱うパッケージがエクスポートされたフィールドを必要とする理由です。 –
'{[0x176f44] 0x176f44}'を表示します。私は反射が非公開フィールドにアクセスできると思います:http://stackoverflow.com/questions/17981651/in-go-is-there-any-way-to-access-private-fields-of-a-struct-from-another- packag –