TLを情報; DR:最初のケースであなたは、印刷用タイプ*Test
の値を渡しますが、後者の場合には、あなたがタイプ*interface{}
の値を渡します! %v
動詞は、デフォルトの書式設定を使用して書式を設定することを意味しますが、既定の書式設定は値の種類によって異なります。
ご覧の違いはfmt
パッケージの実装のルールをフォーマットするだけでデフォルトです。
あなたは
fmt.Printf()
を使用している
:
タイプ
interface{}
としてフォーマット文字列や他の引数を取り
func Printf(format string, a ...interface{}) (n int, err error)
。したがって、渡す値のタイプがinterface{}
ではない場合、値はinterface{}
の値にラップされます。
今度はあなたの例を見てみましょう:
test1 := Test{}
// ...
fmt.Printf("%v", &test1)
test1
はタイプTest
のものであり、あなたはタイプ*Test
のある&test1
を渡します。これはinterface{}
にラップされます。fmt
のパッケージドキュメントからフォーマットルール:化合物のオブジェクトについて
は、要素がこれらの規則を使用して印刷され、再帰的に、このようなレイアウト:それへのポインタであるので
struct: {field0 field1 ...}
array, slice: [elem0 elem1 ...]
maps: map[key1:value1 key2:value2]
pointer to above: &{}, &[], &map[]
struct
、&{}
形式が使用されます。 Test
にはフィールドTest string
がありますが、値を設定していないので、string
のzero valueがデフォルトで空の文字列""
に設定されています。だからこそ、あなたは何も見えません。
test1 := Test{"a"}
出力がされているでしょう:
&{a}
はのは、あなたの第二の例を見てみましょう:
test2 := Models["test"]
// ...
fmt.Printf("%v", &test2)
最初の行はshort variable declarationであるあなたは、このようにそれを初期化していた場合があります、test2
のタイプは、右側の式から推論されます。右側の式はindex expressionで、地図のインデックスを作成します。タイプはマップの値タイプになります。Models
のタイプはmap[string]interface{}
なのでtest2
のタイプはinterface{}
になります。
これまでのところとても良いです。しかし、fmt.Printf("%v", &test2)
のように印刷しようとするとどうなりますか? interface{}
のtest2
へのポインターを渡すので、渡すものは*interface{}
タイプで、interface{}
と同じではないため、別のinterface{}
値でラップされます。
だから何fmt.Printf()
に渡されることはtest2
変数のアドレスであること*interface{}
値をラップinterface{}
値、です。
そして今ここに適用される書式設定のルール:
%のVのデフォルトの形式は次のとおりです。
bool: %t
int, int8 etc.: %d
uint, uint8 etc.: %d, %x if printed with %#v
float32, complex64, etc: %g
string: %s
chan: %p
pointer: %p
にフォーマットされる値は、ポインタ(*interface{}
)であるので、%v
%p
のデフォルト値は、
ポイントR:だから、結果は適切例えば、16進数形式でアドレス値を印刷している。:
0x1040a160
をtest2
から構造体を得るために
%p base 16 notation, with leading 0x
、あなたはtype assertionを使用することができます。
t2 := Models["test"]
test2 := t2.(Test) // test2 is of type Test
このtest2
はtest1
のものと同じタイプを持っており、印刷するときに同じ結果を生成します。だから、むしろこのようなものでなければなりません。 Go Playgroundで試してみてください。
ベストマップに格納interface{}
が既に使用され得るTest
へのポインタであるように、マップに*Test
値を格納する、などもローカル変数に格納ないタイプアサーションまたは必要ないであろうけれどもであろう/そのままそのまま渡される。
ここにコードを貼り付ける必要があります。要約すると 'test1'は' Test'の型を持ち、 'test2'は' interface {} '(空のインタフェース)の型を持っています。それは別のタイプです。 – ymonad
@ymonadはい、私はそれをチェックしましたが、正しい構造体に広告を戻すにはどうすればいいですか? – PumpkinSeed
'map [string] interface {}'を 'map [string] Test'に変更できます。しかし、私はこれが[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)だと思います。解決したい問題がありますか? – ymonad