Смаршалить в JSON поля внешней структуры через метод внутренней, или один метод для всех типов?
Разрабатывая на go я уяснил одну очень важную особенность - нельзя думать так как бы вы это делали на другом языке, а надо думать как в go. Не хочу вдаваться в вашу проблему, но думаю что есть выход, например, не создавать столько структур.
По вопросу: делаете интерфейс с геттерами/сеттерами и 1 функцию принимающую этот интерфейс в качестве аргумента. Юзаете функцию, отдавая ей ссылку на объект структуры.
Да-да, не получится сделать метод, и сделать через задницу, но это по меркам  многих других языков, в го - это норма. 
Можно ещё поиграться с рефлексией или генераторами. 1ое не go-way, 2ое норм, но надо заморочится с генерацией.
Решение дали на 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)
}