Решение дали на
stackoverflow и как подсказал
Никита
Решение простое -
func Save(i interface{}, id int) {
data, err := json.Marshal(i)
check(err)
if id == 0 {
_, err = app.DB.Exec(`INSERT INTO users(data) VALUES ($1) `, string(data))
} else {
_, err = app.DB.Exec(`UPDATE users SET data = $1 WHERE id=$2`, string(data), id)
}
check(err)
}
и вызывать
u := User{}
a := Admin{}
Save(u, u.ID)
Save(a, a.ID)
Мне потом ещё потребовалось присваивать ID, вернувшееся из базы обратно в структуру, поэтому я сделал
interface Model {
getID()
setID()
}
Сделал реализацию этого интерфейса для User и использовал его вместо interface{}
func Save(i model) {
data, err := json.Marshal(i)
var id int
check(err)
if i.getID() == 0 {
err = app.DB.QueryRow(`INSERT INTO users(data) VALUES ($1) RETURNING id`, string(data)).Scan(&id)
i.setID(id)
} else {
_, err = app.DB.Exec(`UPDATE users SET data = $1 WHERE id=$2`, string(data), i.getID())
}
check(err)
}