Создайте интерфейс, такой как:
type SQLRunner interface{
Prepare(query string) (*sql.Stmt, error)
PrepareContext(ctx context.Context, query string) (*sql.Stmt, error)
Query(query string, args ...interface{}) (*Rows, error)
QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
// add as many method shared by both sql.Tx qnd sql.DB
// ...
}
И затем создайте один метод, использующий этот интерфейс:
func Save(s SQLRunner) error {
s.Prepare()
}
В реализации интерфейса go неявно, так что вам просто нужно пройти* sql.Tx или * sql.DB для функции сохранения:
Save(tx)
Save(db)
Вот хороший пост в блоге об интерфейсах в go: http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go