Как мне добавить ко всем строковым значениям внутри структуры? - PullRequest
2 голосов
/ 27 мая 2020

У меня есть структура, определенная в fruits.go

package domain

type AppleImages struct {
    Front string `json:"frontImage"`
    Back  string `json:"backImage"`
    Top   string `json:"topImage"`
}

И я определил то же самое в process.go (который возвращает эти данные обработчику). Это определение предназначено только для демонстрационных целей, поскольку я получаю значения из базы данных с помощью gorm, поэтому мы не можем добавить сюда требуемый URL.

package process

func getApple() (apple domain.Apple){
    apple = domain.Apple{
        Front: "front-image.png"
        Back: "back-image.png"
        Top: "top-image.png"
    }
    return
}

Для моего вывода нужно вернуть

{
    frontImage: "https://www.example.com/front-image.png",
    backImage: "https://www.example.com/back-image.png",
    topImage: "https://www.example.com/top-image.png",
}

Я не хочу вручную добавлять https://www.example.com/ к каждому из изображений в структуре.

Есть ли способ разобрать структуру и автоматически добавить эту строку ко всем существующие значения?

Ответы [ 3 ]

2 голосов
/ 27 мая 2020

Используйте горм AfterFind крючок. Каждый раз после загрузки данных из базы данных вызовите gorm AfterFind, и ваши данные будут обновлены для модели Apple. Тогда вам не нужно делать это вручную после каждого извлечения из базы данных.

func (u *Apple) AfterFind() (err error) {
  u.Front= "https://www.example.com/"+ u.Front
  u.Back= "https://www.example.com/"+ u.Back
  u.Top= "https://www.example.com/"+ u.Top
  return
}

См. Подробности здесь

1 голос
/ 27 мая 2020

Вы можете использовать reflect, чтобы добавить префикс для каждого поля в структуре. Подробности смотрите здесь .

func getApple() (apple domain.Apple) {
    apple = domain.Apple{
        Front: "front-image.png",
        Back:  "back-image.png",
        Top:   "top-image.png",
    }
    addURL(&apple, "https://www.example.com/")
    //fmt.Println(apple)
    return
}

func addURL(apple *domain.Apple, url string) {
    structValue := reflect.ValueOf(apple).Elem()
    for i := 0; i < structValue.NumField(); i++ {
        fieldValue := structValue.Field(i)

        // skip non-string field
        if fieldValue.Type().Kind() != reflect.String {
            continue
        }

        structValue.Field(i).SetString(url + fieldValue.String())
    }
}
1 голос
/ 27 мая 2020

Есть ли способ проанализировать структуру и автоматически добавить эту строку ко всем существующим значениям?

Нет.

Я не хочу чтобы вручную добавить https://www.example.com/ к каждому из изображений в структуре.

Go не предоставляет magi c, чтобы что-то могло произойти без вашего программирования. Вы должны сделать это «вручную».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...