Как указано в документации DB.Prepare()
:
Несколько запросов или выполнений могут выполняться одновременно из возвращенного оператора.
Itбезопасен для одновременного использования, хотя предназначенное использование для подготовленных операторов не предназначено для совместного использования их между несколькими запросами.Основная причина заключается в том, что подготовленный оператор (может) выделяет ресурсы на самом сервере БД, и он не освобождается до тех пор, пока вы не вызовете метод Close()
возвращенного оператора.Поэтому я бы посоветовал против этого.
Типичный вариант использования - это если вам приходится выполнять один и тот же оператор несколько раз с разными параметрами, как, например, в документации:
projects := []struct {
mascot string
release int
}{
{"tux", 1991},
{"duke", 1996},
{"gopher", 2009},
{"moby dock", 2013},
}
stmt, err := db.Prepare("INSERT INTO projects(id, mascot, release, category) VALUES( ?, ?, ?, ? )")
if err != nil {
log.Fatal(err)
}
defer stmt.Close() // Prepared statements take up server resources and should be closed after use.
for id, project := range projects {
if _, err := stmt.Exec(id+1, project.mascot, project.release, "open source"); err != nil {
log.Fatal(err)
}
}