В пакете gosqlite, который я использую, есть метод с переменным , тип которого - пустой интерфейс .
func (s *Stmt) Exec(args ...interface{}) os.Error
Я могу назвать это штрафом, если явно передаю отдельные параметры:
statement := blah()
error := statement.Exec("hello", 3.0, true) // works fine
Однако, поскольку переменный параметр соответствует заполнителям в операторе в
моего оператора SQL select
, число количество этих заполнителей неизвестно во время компиляции, но динамически изменяется во время выполнения в зависимости от того, что делает пользователь. Например. Если пользователь вводит четыре значения, я получаю SQL, похожий на следующий:
SELECT * FROM sky WHERE name IN (?,?,?,?)
Естественно, я хотел бы вызвать метод Exec
с фрагментом строк:
var values []string = getValuesFromUser()
statement := createStatementWithSufficientNumberOfPlaceholders(len(values))
_ := statement.Exec(values...) // compiler doesn't like this
Он не компилируется. Я могу обойти эту проблему, создав пустой фрагмент интерфейса и скопировав ссылки:
values2 := make([]interface{}, len(values))
for index, value := range values { values2[index] = value }
_ := statement.Exec(values2...) // compiler happy but I'm not
И это работает нормально, но кажется немного неуклюжим. Мне было интересно, есть ли какой-то трюк, позволяющий передавать значения
напрямую этой функции, или, если это не удается, более аккуратный способ преобразования строкового фрагмента в пустой интерфейс?
Большое спасибо.