12

JSONファイルを次のように解析したいmap[string]interface{}:

var migrations map[string]interface{}
json.Unmarshal(raw, &migrations)

fmt.Println(migrations["create_user"])

しかし、データを指すようにコードを変更しましたinterface{}:

var migrations interface{}
json.Unmarshal(raw, &migrations)

// compile wrong here
fmt.Println(migrations["create_user"])

上記の場合のmap[string]interface{}との違いについてはよくわかりません。interface{}

4

2 に答える 2

35

これら 2 つのタイプの違いは、次のように見えます。

  1. interface{}すべてのタイプが関数なしでインターフェイスを実装するため、「any」タイプです。

  2. map[string]interface{}キーが文字列で、値が任意の型のマップです。

バイト配列を JSON からメモリにアンマーシャリングする場合、interface{}型を使用するのが最も簡単です。これは、任意の型の JSON ドキュメント (オブジェクト、配列、プリミティブなど) を格納できるためです。ただし、基になるデータを処理するには、より多くのリフレクションが必要になる場合があります。map[string]interface{}JSON ドキュメントがオブジェクトであることがわかっている場合はa を使用するのが一般的[]interface{}であり、ドキュメントが配列であることがわかっている場合は a を使用するのが一般的です。

ただし、特にドキュメントの構造が事前にわかっている場合は、JSON をアンマーシャリングするための最善の方法は、データを正確に記述するカスタム構造体型を定義して使用することです。このようにして、反射を回避し、コードの読みやすさを向上させることができます。

于 2018-02-26T16:48:58.607 に答える