GoLang – цикл по массиву структур – могу ли я сопоставить?

Я новичок в GoLang, пришел из Node. Немного опоздал с игрой (определенно нефункциональной), и мне нужна помощь в понимании подходов, а возможно, и просто в понимании...

Я хочу исключить элемент из группы структур массива.

lo.Map(twelveShuffledQuestions, func(q StaticQuestion) {
        return &StaticQuestionMinusCorrectAnswer{
            QuestionId:       q.QuestionId,
            QuestionType:     q.QuestionType,
            QuestionText:     q.QuestionText,
            PotentialAnswers: q.PotentialAnswers,
            Image:            q.Image,
        }
    })

По сути, все это делается для того, чтобы показать шаблон, как бы я это сделал в узле (с помощью lo) — и нет, это не компилируется, поскольку он не может вывести тип args.

Что касается структуры данных здесь, twelveShuffledQuestions поддерживается JSON, то есть он был импортирован, а затем маршалирован:

jsonFile, err := os.Open("questions.json")
if err != nil {
    panic(err)
}
defer jsonFile.Close()
byteValue, _ := io.ReadAll(jsonFile)
localQuestionsToCheckAgainst := []StaticQuestion{}
json.Unmarshal([]byte(byteValue), &localQuestionsToCheckAgainst)

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

Если вы изучаете язык, я бы посоветовал не использовать пакет lo. Идиоматический способ написать этот код — самостоятельно перебирать цикл, самостоятельно создавая срез результата (например, как в ответе Итона Скрибнера). Это может измениться в следующем выпуске Go, который будет включать итераторы, но сейчас это лучший способ. Go — это не Node, и идиома go — писать простые вещи самостоятельно, а не использовать зависимости.

Paul Hankin 13.07.2024 09:27

Принято к сведению, большое спасибо

Harry Lincoln 13.07.2024 18:37
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прокрутите исходные вопросы. Создайте вопрос без ответа и добавьте к результату.

byteValue, err := os.ReadFile("questions.json")
if err != nil { panic(err) }
var localQuestionsToCheckAgainst []*StaticQuestion
json.Unmarshal(byteValue, &localQuestionsToCheckAgainst)
var result []*StaticQuestionMinusCorrectAnswer
for _, q := range localQuestionsToCheckAgainst {
    result = append(result, &StaticQuestionMinusCorrectAnswer{
        QuestionId:       q.QuestionId,
        QuestionType:     q.QuestionType,
        QuestionText:     q.QuestionText,
        PotentialAnswers: q.PotentialAnswers,
        Image:             q.Image,
    })
}

Вот как использовать пакет lo:

byteValue, err := os.ReadFile("questions.json")
if err != nil { panic(err) }
var localQuestionsToCheckAgainst []*StaticQuestion
json.Unmarshal(byteValue, &localQuestionsToCheckAgainst)
result := lo.Map(localQuestionsToCheckAgainst, func(q *StaticQuestion, i int) *StaticQuestionMinusCorrectAnswer {
    return &StaticQuestionMinusCorrectAnswer{
        QuestionId:       q.QuestionId,
        QuestionType:     q.QuestionType,
        QuestionText:     q.QuestionText,
        PotentialAnswers: q.PotentialAnswers,
        Image:            q.Image,
    }
})

Цикл for с предложением диапазона (первый фрагмент в этом ответе) — это идиоматический способ написания кода. Предстоящая функция range делает циклы предпочтительным способом написания большинства итерационного кода.

Другие вопросы по теме