Как удалить свойство из объекта

У меня есть структура пользователя:

type User struct {
    gorm.Model
    Email         string
    Password      string
    AccountType   int
    CompanyId     int
    FirstName     string
    LastName      string
    PhoneNumber   string
    RecoveryEmail string
    Contractor    bool `gorm:"sql:'not null' default:'false'"`
}

Я использую эту структуру для получения строки из базы данных с помощью gorm:

// Get a specific user from the database.
func getUser(id uint) (*User, error) {

    var user User

    if err := database.Connection.Select("id, created_at, email, account_type, company_id, first_name, last_name").Where("id = ? ", id).First(&user).Error; err != nil {
        return nil, err
    }

    fmt.Println(&user)
    return &user, nil
}

Мой Gin hanlder:

// @Summary Attempts to get a existing user by id
// @tags users
// @Router /api/users/getUserById [get]
func HandleGetUserById(c *gin.Context) {
    // Were using delete params as it shares the same interface.
    var json deleteParams

    if err := c.Bind(&json); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"message": "No user ID found, please try again."})
        return
    }

    outcome, err := getUser(json.Id)

    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"message": "Something went wrong while trying to process that, please try again.", "error": err.Error()})
        log.Println(err)
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "message": "Successfully found user",
        "user":    outcome,
    })

}

Он возвращает все нормально, но когда я возвращаю &user, невыбранные поля возвращаются со значениями по умолчанию:

{
    "message": "Successfully found user",
    "user": {
        "ID": 53,
        "CreatedAt": "2018-06-24T00:05:49.761736+01:00",
        "UpdatedAt": "0001-01-01T00:00:00Z",
        "DeletedAt": null,
        "Email": "[email protected]",
        "Password": "",
        "AccountType": 0,
        "CompanyId": 2,
        "FirstName": "",
        "LastName": "",
        "PhoneNumber": "",
        "RecoveryEmail": "",
        "Contractor": false
    }
}

Есть ли способ удалить пустые или нулевые свойства из объекта? Или мне придется вместо этого отправить обратно объект со значениями, сопоставленными с указанным новым объектом? Если есть простой способ сделать первое с помощью вспомогательной функции, я хотел бы знать, как это сделать.


person li x    schedule 25.06.2018    source источник
comment
Не могли бы вы спросить из-за рабочего процесса обновления? doc.gorm.io/crud.html#update, т.е. получение объекта, изменение поле и не хотите обновлять / перезаписывать поля этими нулевыми значениями?   -  person dm03514    schedule 25.06.2018
comment
@ dm03514 рабочий процесс обновления работает так, как задумано в других моих методах, и я не возражаю против материала значений по умолчанию, я просто действительно не хочу отправлять весь объект из api с каждым ключом таблицы, даже если он пуст, я думаю Я также пытаюсь избежать простого возврата сопоставленного объекта, я бы предпочел отредактировать свой указатель и просто вернуть его для вывода.   -  person li x    schedule 25.06.2018
comment
Я обновил свой вопрос, чтобы также включить обработчик джина, чтобы дать немного лучший контекст всего процесса, которым я сейчас занимаюсь.   -  person li x    schedule 25.06.2018
comment
Ваши поля пусты. Если вы хотите, чтобы они были равны нулю, вам нужно поле, способное принимать значение NULL. Строка не может быть нулевой. Указатель на строку может быть.   -  person phemmer    schedule 25.06.2018
comment
@Patrick Если вы видите в ответе, что даже когда свойство создано null, оно не удалено из объекта, я хочу удалить эти свойства, чтобы затем его можно было отправить обратно как json в возврате, я не думаю, что просто установка для них типа, допускающего значение NULL, изменит это   -  person li x    schedule 25.06.2018


Ответы (1)


Вы можете указать тег omitempty в определениях полей вашего объекта.

Пример:

Email string `json:",omitempty"`

Если вы определите поля таким образом, пустые значения не будут присутствовать в выводе JSON:

https://golang.org/pkg/encoding/json/#Marshal

Параметр «omitempty» указывает, что поле должно быть исключено из кодировки, если поле имеет пустое значение, определенное как false, 0, указатель nil, значение интерфейса nil и любой пустой массив, фрагмент, карту или строку.

person eugenioy    schedule 25.06.2018
comment
Выглядит многообещающе, судя по описанию, я попробую. - person li x; 25.06.2018
comment
Это именно то, что я искал и не мог найти в руководстве по gorm, большое спасибо за ваш ответ. - person li x; 25.06.2018