pakiet używam, gosqlite, ma metodę z parametrem o zmiennej liczbie argumentów gdzie jego typ jest pusty interfejs.Przełęcz kawałek ciąg o zmiennej liczbie argumentów pusty parametr interface
func (s *Stmt) Exec(args ...interface{}) os.Error
mogę nazwać to w porządku, jeśli wyraźnie przechodzą poszczególne parametry:
statement := blah()
error := statement.Exec("hello", 3.0, true) // works fine
Jednak jako parametr o zmiennej liczbie argumentów odpowiada zastępcze zasięgu operatora in
z moja instrukcja SQL na select
liczba tych zastępczych jest nieznany w czasie kompilacji, ale dynamicznie zmienia się w czasie wykonywania w zależności od tego, co robi użytkownik. Na przykład. I skończyć z SQL podobny do poniższego jeśli użytkownik wprowadzi cztery wartości:
SELECT * FROM sky WHERE name IN (?,?,?,?)
Więc naturalnie chciałbym wywołać metodę Exec
z plasterkiem ciągi:
var values []string = getValuesFromUser()
statement := createStatementWithSufficientNumberOfPlaceholders(len(values))
_ := statement.Exec(values...) // compiler doesn't like this
nie skompilować . mogę ominąć ten problem poprzez stworzenie pusty kawałek interfejsu i kopiowanie referencje na:
values2 := make([]interface{}, len(values))
for index, value := range values { values2[index] = value }
_ := statement.Exec(values2...) // compiler happy but I'm not
I to działa dobrze, ale czuje się nieco niezgrabne. Zastanawiam się, czy istnieje jakiś trik, aby móc przekazać values
bezpośrednio do tej funkcji, lub, w przeciwnym razie, lepszy sposób konwersji wycinka łańcucha na pusty interfejs?
Wielkie dzięki.
Opuściłem kod konwersji w tej chwili: funkcja wydaje się przesadna, gdy ją dodałem. Domyślam się, że problem polega na tym, że Go nie obsługuje kowariancyjnych tablic/plasterków w sposób, w jaki jestem przyzwyczajony do Javy i C#, co jest prawdopodobnie [nie jest to złe] (http://en.wikipedia.org/wiki /Covariance_and_contravariance_(computer_science)#Arrays_in_C.23_and_Java). –