Передача строкового фрагмента в переменный параметр пустого интерфейса

В пакете 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

И это работает нормально, но кажется немного неуклюжим. Мне было интересно, есть ли какой-то трюк, позволяющий передавать значения напрямую этой функции, или, если это не удается, более аккуратный способ преобразования строкового фрагмента в пустой интерфейс?

Большое спасибо.

14
задан Paul Ruane 2 November 2011 в 02:12
поделиться