Разница между map[string]interface{} и interface {}

Я хочу проанализировать файл 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{} в вышеуказанном случае.

2 ответа

Решение

Это потому, что по умолчанию вам нужно ввести assert interface{}, чтобы получить базовое значение map[string]interface{}.

Согласно спецификации GoLang

Для выражения x типа интерфейса и типа T основное выражение

x.(T)

утверждает, что x не равен nil и что значение, хранящееся в x, имеет тип T. Обозначение x.(T) называется утверждением типа.

Также Unmarshal функция требует указатель на migration интерфейса типа {} или map [string] interface {}

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

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

поскольку migrations это не карта Таким образом, вы не можете использовать его ключ, чтобы получить значение. Интерфейс {} не имеет ключей

Разница между этими двумя типами заключается в том, что кажется:

  1. interface{} это "любой" тип, так как все типы реализуют интерфейс без функций.

  2. map[string]interface{} карта, ключи которой являются строками, а значения любого типа.

При демаршалировании байтового массива из JSON в память проще всего использовать interface{} тип, поскольку он может хранить любой тип документа JSON (объекты, массивы, примитивы и т. д.); однако для обработки базовых данных может потребоваться больше размышлений. Используя map[string]interface{} распространено, когда вы знаете, что документ JSON является объектом и []interface{} Обычно, когда вы знаете, что документ является массивом.

Однако лучший подход для демаршалинга JSON - особенно когда вы заранее знаете структуру документов - это определять и использовать пользовательские типы структур, которые точно описывают данные. Таким образом, вы можете избежать каких-либо размышлений и улучшить удобочитаемость вашего кода.

Другие вопросы по тегам