Разница между 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{}.
Для выражения 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
это не карта Таким образом, вы не можете использовать его ключ, чтобы получить значение. Интерфейс {} не имеет ключей
Разница между этими двумя типами заключается в том, что кажется:
interface{}
это "любой" тип, так как все типы реализуют интерфейс без функций.map[string]interface{}
карта, ключи которой являются строками, а значения любого типа.
При демаршалировании байтового массива из JSON в память проще всего использовать interface{}
тип, поскольку он может хранить любой тип документа JSON (объекты, массивы, примитивы и т. д.); однако для обработки базовых данных может потребоваться больше размышлений. Используя map[string]interface{}
распространено, когда вы знаете, что документ JSON является объектом и []interface{}
Обычно, когда вы знаете, что документ является массивом.
Однако лучший подход для демаршалинга JSON - особенно когда вы заранее знаете структуру документов - это определять и использовать пользовательские типы структур, которые точно описывают данные. Таким образом, вы можете избежать каких-либо размышлений и улучшить удобочитаемость вашего кода.