web-dev-qa-db-fra.com

Différence entre l'interface de la carte [chaîne] {} et l'interface {}

Je souhaite analyser un fichier JSON en un map[string]interface{}:

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

fmt.Println(migrations["create_user"])

Mais j'ai modifié mon code pour pointer les données vers interface{}:

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

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

Je ne comprends pas grand-chose à la différence entre map[string]interface{} et interface{} dans le cas ci-dessus.

5
Trần Kim Dự

C'est parce que par défaut, vous devez taper assert interface {} pour obtenir la valeur sous-jacente de map [string] interface {}.

Selon GoLang Spécifications

Pour une expression x de type interface et un type T, l'expression principale

x.(T)

affirme que x n'est pas nul et que la valeur stockée dans x est de type T. La notation x. (T) est appelée une assertion de type.

La fonction Unmarshal requiert également un pointeur vers migration de type interface {} ou map [string] interface {}

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

fmt.Println(migrations.(interface{}).(map[string]interface{})["create_user"])

Puisque migrations n'est pas une carte. Vous ne pouvez donc pas utiliser sa clé pour obtenir la valeur. L'interface {} n'a pas de clés

6
Himanshu

La différence entre ces deux types est juste ce qu'il semble:

  1. interface{} est le type "any", car les types all implémentent l'interface sans fonction.

  2. map[string]interface{} est une carte dont les clés sont des chaînes et les valeurs sont de tout type.

Lors du démasquage d'un tableau d'octets de JSON en mémoire, il est plus facile d'utiliser le interface{} type, car il peut stocker tout type de document JSON (objets, tableaux, primitives, etc.); cependant, cela peut nécessiter plus de réflexion pour gérer les données sous-jacentes. Utilisant un map[string]interface{} est courant lorsque vous savez que le document JSON est un objet et []interface{} est courant lorsque vous savez que le document est un tableau.

Cependant, la meilleure approche pour démêler JSON - en particulier lorsque vous connaissez la structure des documents à l'avance - est de définir et d'utiliser des types de structure personnalisés qui décrivent les données exactement. De cette façon, vous pouvez éviter toute réflexion et améliorer la lisibilité de votre code.

11
maerics