Un paquete que estoy usando, gosqlite, tiene un método con un parámetro variadic en su tipo es la interfaz de vacío.Pass rebanada cadena a variadic parámetro de la interfaz vacío
func (s *Stmt) Exec(args ...interface{}) os.Error
puedo llamar a este bien si pasar explícitamente los parámetros individuales:
statement := blah()
error := statement.Exec("hello", 3.0, true) // works fine
Sin embargo, como el parámetro variadic corresponde a los marcadores de posición en el operador de in
de mi instrucción SQL de select
, el número de estos marcadores de posición es no se conoce en tiempo de compilación pero cambia dinámicamente en tiempo de ejecución según lo que esté haciendo el usuario. P.ej. Termino con SQL similar a la siguiente si el usuario introduce cuatro valores:
SELECT * FROM sky WHERE name IN (?,?,?,?)
Así que, naturalmente, me gustaría llamar al método Exec
con una rodaja de cuerdas:
var values []string = getValuesFromUser()
statement := createStatementWithSufficientNumberOfPlaceholders(len(values))
_ := statement.Exec(values...) // compiler doesn't like this
Esto no compila . Puedo solucionar este problema mediante la creación de una rodaja de interfaz de vacío y la copia de las referencias sobre:
values2 := make([]interface{}, len(values))
for index, value := range values { values2[index] = value }
_ := statement.Exec(values2...) // compiler happy but I'm not
Y esto funciona bien pero se siente un poco torpe. Me preguntaba si había algún truco para poder pasar el values
directamente a esta función o, en su defecto, una forma más clara de convertir el segmento de cadena en uno de interfaz vacía.
Muchas gracias.
He dejado el código de conversión en línea en este momento: la función parece excesiva cuando la agregué. Supongo que el problema, en última instancia, es que Go no es compatible con matrices/divisiones covariantes de la manera en que estoy acostumbrado en Java y C#, que tal vez [no es algo malo] (http://en.wikipedia.org/wiki /Covariance_and_contravariance_(computer_science)#Arrays_in_C.23_and_Java). –