Удалить элемент из структуры, но только для этой одной функции - PullRequest
0 голосов
/ 11 января 2019

Итак, у меня есть структура, которая содержит данные, которые имеют AddedByUser, которая связана с моей пользовательской структурой.

Что я хочу сделать, это удалить UserLevel из AddedByUser

Теперь я хочу сделать это только из этой функции, поэтому использование json:"-" не вариант. Это уберет его из всего вывода json. Я только хочу удалить его из этой единственной функции.

Я также должен сказать, что это модели Gorm, и когда я пытался удалить опцию 10 (UserLevels), он удаляет только внешний набор данных, а не UserLevel из всех данных.

{
    "ID": 1,
    "CreatedAt": "2019-01-08T16:33:09.514711Z",
    "UpdatedAt": "2019-01-08T16:33:09.514711Z",
    "DeletedAt": null,
    "UUID": "00000000-0000-0000-0000-000000000000",
    "Title": "title000",
    "Information": "info999",
    "EventDate": "2006-01-02T15:04:05Z",
    "AddedByUser": {
        "ID": 2,
        "CreatedAt": "2019-01-08T15:27:52.435397Z",
        "UpdatedAt": "2019-01-08T15:27:52.435397Z",
        "DeletedAt": null,
        "UUID": "b019df80-a7e4-4397-814a-795e7e84b4ca",
        "Firstname": "Me",
        "Surname": "admin",
        "Password": "....",
        "Email": "admin@email.co.uk",
        "UserLevel": {
            "ID": 0,
            "CreatedAt": "0001-01-01T00:00:00Z",
            "UpdatedAt": "0001-01-01T00:00:00Z",
            "DeletedAt": null,
            "LevelTitle": "",
            "UserLevel": null
        },

Так вот, что я пытался,

data := []models.MyData{}
data = append(data[0:2])

У меня есть около 14 результатов, без добавления он загружает все результаты, но при этом загружает только два результата. Идея заключалась в том, чтобы удалить либо UpdateAt, либо Title. Поскольку я не уверен, что информация модели gorm все 0 или если срез видит их как 0,1,2,3,4 и т. Д.

Я также пытался разбираться по фрагментам моделей, хотя я могу получить доступ к каждому из разделов, я не могу найти простой метод удаления данных по имени из структуры? Карты, кажется, имеют это, но не структуры, которые я не уверен почему?

Спасибо.

UPDATE

Это модель, которую я использую:

//Model
type MyData struct {
  gorm.Model
  UUID              uuid.UUID
  Title       string
  Information string
  EventDate       time.Time

  AddedByUser   Users `gorm:"ForeignKey:added_by_user_fk"`
  AddedByUserFK uint
 }

//Users Model
type Users struct {
  gorm.Model
  UUID      uuid.UUID
  Firstname string
  Surname   string
  Password  string
  Email     string

  UserLevel   UserLevels `gorm:"ForeignKey:user_level_fk" json:",omitempty"`
  UserLevelFK uint
}

1 Ответ

0 голосов
/ 11 января 2019

Как упомянуто в комментариях, вы не можете удалить поля из значения структуры, поскольку это приведет к значению другого типа.

Однако вы можете установить для полей их нулевое значение. В сочетании с тегом omitempty JSON вы можете исключить поля из кодировки JSON. Для правильной работы необходимо изменить поле UserLevel на тип указателя (в противном случае вы получите пустые объекты в документе JSON).

Типы сокращены для краткости:

package main

import (
    "encoding/json"
    "fmt"
)

type MyData struct {
    Title       string
    AddedByUser Users
}

type Users struct {
    ID        int
    UserLevel *UserLevels `json:",omitempty"` // pointer type with omitempty
}

type UserLevels struct {
    LevelTitle string
}

func main() {
    var x MyData
    x.Title = "foo"
    x.AddedByUser.ID = 2
    x.AddedByUser.UserLevel = &UserLevels{}

    f(x)

    b, _ := json.MarshalIndent(x, "", "  ")
    fmt.Println("main:\n" + string(b))
}

func f(x MyData) {
    // "unset" UserLevel. Since we are receiving a copy of MyData, this is
    // invisible to the caller.
    x.AddedByUser.UserLevel = nil

    b, _ := json.MarshalIndent(x, "", "  ")
    fmt.Println("f:\n" + string(b))
}

// Output:
// f:
// {
//   "Title": "foo",
//   "AddedByUser": {
//     "ID": 2
//   }
// }
// main:
// {
//   "Title": "foo",
//   "AddedByUser": {
//     "ID": 2,
//     "UserLevel": {
//       "LevelTitle": ""
//     }
//   }
// }

Попробуйте на детской площадке: https://play.golang.org/p/trUgnYamVOA

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

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

type MyData struct {
    ID    int
    Title string
}

func main() {
    var x MyData
    x.ID = 1
    x.Title = "foo"

    f(x)
}

func f(x MyData) {
    type data struct { // same as MyData, except the field tags
        ID    int
        Title string `json:"-"`
    }

    b, _ := json.MarshalIndent(data(x), "", "  ")
    fmt.Println("main:\n" + string(b))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...