У меня есть типичная функция, которая принимает запрос post от внешнего интерфейса и декодирует данные в структуру, чтобы поместить их в базу данных psql. Вы можете увидеть код ниже. Моя проблема в том, что я хочу иметь возможность абстрагировать эту функцию, чтобы я мог дать ей любое количество переменных любого типа, чтобы для каждого запроса не требовался отдельный обработчик записи.
Это выглядит сложно, потому что мне нужно было бы каким-то образом перейти к абстракции var profitReq profitReq
для работы с любой структурой. Если бы у Голанга был какой-то метод eval string, я бы знал, как это сделать, но кто-то исправит меня, если я ошибаюсь, но я не думаю, что это так.
Другое место, которое мне нужно изменить, находится в QueryRow - я должен быть в состоянии передать его в переменное число переменных. Я мог бы создать строку достаточно легко, но я не уверен, как обязательно добавлять переменные в этот QueryRow. Например, если я добавлю все переменные в массив, я не смогу передать этот массив в QueryRow, так как он не структурирован. Опять же, здесь может помочь какое-то утверждение.
Я новичок в golang, но я видел много интересных вещей, связанных с интерфейсами, которые я, правда, не очень хорошо понимаю. Был бы способ использовать интерфейс, который бы помог?
Спасибо всем, кто может помочь!
func Write_profit_table(profitWriteChannel chan string, profitType string, req *http.Request) {
var profitReq profitReq;
err := json.NewDecoder(req.Body).Decode(&profitReq);
if err!=nil{
log.Panic(err)
}
NotInDB, _ := Search_userinfo_table(profitReq.Email)
if NotInDB == false {
var lastInsertId int
err2 := db.QueryRow("INSERT INTO profit(email, type, dateArray, amount, interest, compounded, recurring, name, description, profitFrom)
VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) returning uid;",
profitReq.Email, profitReq.Type, pq.Array(profitReq.DateArray), profitReq.Profit, profitReq.Interest,
profitReq.Compounded, profitReq.Recurring, profitReq.Name, profitReq.Description, profitReq.ProfitFrom).Scan(&lastInsertId);
if err2!=nil{
log.Panic(err2)
}
}
profitWriteChannel<-"finished writing to profit"
}