Как Unmarshal определяет в какое поле структуры сбросить данные из json?

В языке программирования Go функция Unmarshal из пакета encoding/json используется для преобразования данных JSON в объекты Go. При выполнении этой функции, объект JSON распаковывается и его значения присваиваются соответствующим полям структуры Go.

Чтобы Unmarshal мог определить, в какое поле структуры сбросить данные из JSON, она использует следующие правила:

1. Имя поля в структуре должно совпадать с именем поля в JSON. Это означает, что если в JSON поле называется "name", то и в структуре оно должно называться "name". Это основное правило и оно применяется по умолчанию.

Пример:

type Person struct {
    Name string `json:"name"`
}

2. Если имя поля в структуре отличается от имени поля в JSON, то можно использовать теги json. Теги json позволяют указать, какое поле структуры должно быть связано с полем JSON.

Пример:

type Person struct {
    FirstName string `json:"first_name"`
    LastName  string `json:"last_name"`
}

В этом примере поля FirstName и LastName структуры Person будут заполняться данными из полей "first_name" и "last_name" соответственно.

3. Если поле структуры имеет тип указательный (например, *string), то если поле JSON имеет значение null, то это поле будет установлено в nil, иначе оно будет инициализировано указываемым значением JSON.

Пример:

type Person struct {
    Name *string `json:"name"`
}

В этом примере поле Name структуры Person будет nil, если поле JSON "name" имеет значение null. В противном случае, для Name будет выделена память и в него будет записано указанное значение JSON.

4. Если поле структуры имеет тип интерфейса (например, interface{}), то в него можно поместить значения любого типа из JSON. Значение будет автоматически преобразовано в соответствующий тип интерфейса.

Пример:

type Person struct {
    Data interface{} `json:"data"`
}

В этом примере поле Data структуры Person может содержать значения любого типа из JSON.

В целом, функция Unmarshal достаточно гибкая и позволяет легко преобразовывать данные из JSON в объекты Go, используя правила соответствия полей. Однако, для правильной работы необходимо соблюдать правила именования и использовать теги json, если необходимо задать правила соответствия полей вручную.