Я новичок в 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)
Мой вопрос: как мне добиться такого сопоставления полей, которые я хочу, из структур в массиве?
Принято к сведению, большое спасибо
Прокрутите исходные вопросы. Создайте вопрос без ответа и добавьте к результату.
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 делает циклы предпочтительным способом написания большинства итерационного кода.
Если вы изучаете язык, я бы посоветовал не использовать пакет
lo
. Идиоматический способ написать этот код — самостоятельно перебирать цикл, самостоятельно создавая срез результата (например, как в ответе Итона Скрибнера). Это может измениться в следующем выпуске Go, который будет включать итераторы, но сейчас это лучший способ. Go — это не Node, и идиома go — писать простые вещи самостоятельно, а не использовать зависимости.