2016-04-05 9 views
0

:この文を分解するこのリテラルのタイプは何ですか? <code>mgo</code>ドキュメントから

pipe := collection.Pipe([]bson.M{{"$match": bson.M{"name": "Otavio"}}}) 

、私はcollection.Pipeに渡される引数の型[]bson.Mであることがわかります。スライスが[]sometype{ ... }の構文で初期化されているとすれば、前述のスライスには正確に1つのアイテム(len == 1)が含まれており、このアイテムは{"$match": bson.M{"name": "Otavio"}}リテラルであると結論づけられます。

このリテラルのタイプは何ですか?直感的に、私はそれがmap[string]interface{}だと言いたいが、私は行く遊び場にチェックしようとしたとき、私は、同様のデータ構造を初期化できませんよ:何ですか

  1. https://play.golang.org/p/7QKYaQPi6g

    私の質問は、したがって、二つありますhttps://play.golang.org/p/7QKYaQPi6gのタイプ(私の推論で間違いをしなかったと仮定して)

  2. 私はx := {"foo": 1, "bar": 1}で間違っていますか?このステートメントで

答えて

2

bson.Mで紹介されました。そのdocumentationを参照してください。その

type M map[string]interface{} 

ので、{"$match": bson.M{"name": "Otavio"}はいああ

+2

私がチェックするとは思わなかったことは...これは私の最も華麗な質問の一つではありません...ありがとう! – blz

1
x := {"foo": 1, "bar": 1} 

タイプを控除する可能性はありません。あなたはこのような何かを行うと:

[]bson.M{{"$match": bson.M{"name": "Otavio"}}} 

コンパイラを使用すると、特定のタイプのスライスを初期化していることを知っているので、(それはインタフェースでない限り)、このタイプを毎回繰り返す必要はありません。この活性化はcomposite literalsと呼ばれ、map[string]interface{}の別名です。go1.0

+0

タイプbson.Mであるが、もちろん、として宣言!一方、私は '{" $ match ":bson.M {" name ":" Otavio "}}'が型のものではないと仮定しているので、 bson.M'。 – blz

+0

['bson.M'](https://godoc.org/labix.org/v2/mgo/bson#M)は' map [string] interface {} 'です。だからあなたのケースでは文字列を別の 'bson.M'にマッピングしています – janisz

関連する問題